Sql server 转换SQL Server列的类型

Sql server 转换SQL Server列的类型,sql-server,Sql Server,我的SQL Server数据库中有80多个表。我有500多个专栏。我想更改某些类型的列以释放空间 我写这个脚本只是为了看看nvar和nch的《初学者》专栏 我应该添加到这个脚本中,或者编写另一个脚本来自动转换类型 有人可以帮我,我怎么做 非常感谢。如果您考虑了评论人提出的问题,这可能就是您想要的。脚本将根据引用表的数据准备SQL语句供您使用 但请仔细检查它的正确性。另外,我假设你想要新的线路和围棋,但是如果你不想要的话,你可以很容易地删除它们 SELECT AlterSql = CONC

我的SQL Server数据库中有80多个表。我有500多个专栏。我想更改某些类型的列以释放空间

我写这个脚本只是为了看看nvar和nch的《初学者》专栏

我应该添加到这个脚本中,或者编写另一个脚本来自动转换类型

有人可以帮我,我怎么做


非常感谢。

如果您考虑了评论人提出的问题,这可能就是您想要的。脚本将根据引用表的数据准备SQL语句供您使用

但请仔细检查它的正确性。另外,我假设你想要新的线路和围棋,但是如果你不想要的话,你可以很容易地删除它们

SELECT
    AlterSql = CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ALTER COLUMN ', COLUMN_NAME, ' ', SUBSTRING(DATA_TYPE, 2, LEN(DATA_TYPE)), '(', CHARACTER_MAXIMUM_LENGTH, ') ', CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' WHEN 'NO' THEN 'NOT NULL' ELSE 'ERROR' END, CHAR(13), CHAR(10), 'GO')
  , *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('nchar', 'nvarchar')

请注意,以任何实际释放空间的方式(如减小CHAR或NCHAR列的大小)更改列的类型最初需要更多的空间,因为整个表必须以事务方式重建。减少[N]VARCHAR列的大小基本上是没有意义的,因为磁盘上数据的大小没有改变。它只是防止人们存储更大的值。那么您希望更改哪些数据类型?您打算对找到的列做什么。你说让他们皈依;把它们转换成什么?我不认为仅仅改变数据类型是个好主意。他们应该是那种类型是有原因的。如果要使它们变小,就有被截断的风险。@MarkKram数据的类型是异构的。但我只想将输入nvarchar和nchar的列转换为varchar和charIMHO,如果你想改变方向,下面的脚本很不错。@Jeroenmoster,我说的是处理空间增加问题的不同方法。就像在这个链接中一样,也可以在这里实现相同的逻辑。这会有助于解决空间增加问题吗?请回答。在您的解决方案中,我应该输入表和列的每个名称,因为我知道有80多个表和500多个列要转换它们。您的解决方案只会更改表信息列中的列类型,而不会更改源表中的列类型。是否可以对所有表自动执行此操作,并更改源表中的类型。非常感谢。@vero,我想你误解了我的代码。这段代码不修改INFORMATION_SCHEMA.COLUMNS或其他任何地方的任何内容,它毕竟是一个SELECT FROM语句,不能修改。我的代码所做的是生成查询文本,您可以使用它一次性更新所有列。您只需要复制AlterSql的值一次,然后将它们粘贴到查询窗口中一次,然后运行查询一次。此代码不要求您反复重复。我注意到的一个问题是,如果您的SSMS没有激活保留CR/LF选项,GO部分可能会导致问题。正确的输出应该在奇数行改变,在偶数行改变。如果出现问题,请尝试禁用/删除GO和newline部件或SSMS选项。好的,非常感谢@KtX2SkD。但是为什么你重复了两次:第13次,第10次?我想我应该把它改成varchar。@vero,我猜你认为这些是数据类型。事实并非如此。它们将输出,特别是CR13然后是LF10,以插入一个新行,就像我们通过单击ENTER所做的那样。
SELECT
    AlterSql = CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ALTER COLUMN ', COLUMN_NAME, ' ', SUBSTRING(DATA_TYPE, 2, LEN(DATA_TYPE)), '(', CHARACTER_MAXIMUM_LENGTH, ') ', CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' WHEN 'NO' THEN 'NOT NULL' ELSE 'ERROR' END, CHAR(13), CHAR(10), 'GO')
  , *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE IN ('nchar', 'nvarchar')