我目前正在尝试将数据库的所有表中的所有列从char转换为SQL Server 2012中的nvarchar。
我尝试运行的查询是
select cast((select COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE = 'char') as nvarchar(MAX))
不确定我是否应该通过INFORMATION_SCHEMA.COLUMNS更改数据类型,但我发现这是获取数据类型的最佳方法。
我目前得到的错误是:
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
有没有更好的方法来实现这个或解决此错误,因为它似乎不喜欢我同时将数据类型更改为多行。
答案 0 :(得分:1)
从INFORMATION_SCHEMA.COLUMNS中选择是确定需要转换哪些列的好方法,
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE DATA_TYPE = 'CHAR';
但它不能用于直接更改列的数据类型。 ALTER TABLE用于修改列数据类型:
ALTER TABLE [dbo].[TableName] ALTER COLUMN [ColumnName] NVARCHAR(50);
当你接触它时,除非绝对必要,否则请避免使用NVARCHAR(MAX)
。确保您的数据类型的大小适合该属性。如果您的CHAR
列的大小已经正确,请使用以下脚本生成 ALTER TABLE
语句:
SELECT 'ALTER TABLE ' +
QUOTENAME(TABLE_SCHEMA) + '.' +
QUOTENAME(TABLE_NAME) +
' ALTER COLUMN ' +
QUOTENAME(COLUMN_NAME) +
' NVARCHAR(' +
CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ');'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE = 'char';
请记住,这只会生成ALTER TABLE语句,您需要复制结果并在新选项卡中执行以更改数据类型。
答案 1 :(得分:0)
首先要做的事情。您收到错误,因为select返回多行,并且您尝试将所有column_name强制转换为nvarchar(MAX)。您将来可能需要执行的任何子查询只能返回一行。
select cast((select top 1 COLUMN_NAME
from INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE = 'char') as nvarchar(MAX))
这将解决错误,但这不是你想要做的。
根据以下命令更新所需的所有列:
ALTER TABLE {TableName} ALTER COLUMN {ColumnName} NVARCHAR(大小)
您可以做的是从INFORMATION_SCHEMA.COLUMNS获取table_name和column_name,并构建一个动态脚本,将数据库中的所有列从char更新为nvarchar。