将SQL Server数据库中的所有varchar列更改为nvarchar
我正在尝试将数据库中的所有将SQL Server数据库中的所有varchar列更改为nvarchar,sql,sql-server,sql-server-2008,sql-server-2012,Sql,Sql Server,Sql Server 2008,Sql Server 2012,我正在尝试将数据库中的所有varchar列更新为nvarchar,而不会丢失数据 我有以下疑问: select * from INFORMATION_SCHEMA.COLUMNS where DATA_TYPE = 'varchar' 我如何修改它以更新它找到的列并在整个数据库中反映这些列?我将使用SQL Server特定的sys目录视图,我要做的只是创建更改这些数据类型所需的T-SQL语句,如下所示: SELECT t.name, s.name, c.name, 'ALT
varchar
列更新为nvarchar
,而不会丢失数据
我有以下疑问:
select *
from INFORMATION_SCHEMA.COLUMNS
where DATA_TYPE = 'varchar'
我如何修改它以更新它找到的列并在整个数据库中反映这些列?我将使用SQL Server特定的
sys
目录视图,我要做的只是创建更改这些数据类型所需的T-SQL语句,如下所示:
SELECT
t.name, s.name, c.name,
'ALTER TABLE ' + s.name + '.' + t.Name + ' ALTER COLUMN ' + c.name + ' NVARCHAR(' +
CASE
WHEN c.max_length = -1 THEN 'MAX'
WHEN c.max_length > 4000 THEN 'MAX'
ELSE CAST(c.max_length AS VARCHAR(10)) + ');'
END
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
sys.columns c ON c.object_id = t.object_id
INNER JOIN
sys.types ty ON c.system_type_id = ty.system_type_id
WHERE
ty.name = 'VARCHAR'
AND c.is_computed = 0
在AdventureWorks
数据库上运行,将输出如下内容:
ALTER TABLE Sales.SalesOrderHeader ALTER COLUMN CreditCardApprovalCode NVARCHAR(15);
ALTER TABLE Person.Password ALTER COLUMN PasswordHash NVARCHAR(128);
ALTER TABLE Person.Password ALTER COLUMN PasswordSalt NVARCHAR(10);
然后可以将其从输出网格复制到新的查询窗口并执行
注意:在AdventureWorks
上运行您的原始脚本时,我发现在这种情况下,其中一列是计算的,因此不能简单地使用更改表来修改。。。ALTER COLUMN….
语句-这就是为什么我在这里显示的脚本中排除计算列
如果你真的坚持,你也可以把我的这条SQL语句变成光标的“心脏”,然后迭代T-SQL语句来修改表,并使用
EXEC(…)
或EXEC sp_executesql
执行它们,我会使用SQL Server特定的sys
目录视图,我要做的只是创建更改这些数据类型所需的T-SQL语句,如下所示:
SELECT
t.name, s.name, c.name,
'ALTER TABLE ' + s.name + '.' + t.Name + ' ALTER COLUMN ' + c.name + ' NVARCHAR(' +
CASE
WHEN c.max_length = -1 THEN 'MAX'
WHEN c.max_length > 4000 THEN 'MAX'
ELSE CAST(c.max_length AS VARCHAR(10)) + ');'
END
FROM
sys.tables t
INNER JOIN
sys.schemas s ON t.schema_id = s.schema_id
INNER JOIN
sys.columns c ON c.object_id = t.object_id
INNER JOIN
sys.types ty ON c.system_type_id = ty.system_type_id
WHERE
ty.name = 'VARCHAR'
AND c.is_computed = 0
在AdventureWorks
数据库上运行,将输出如下内容:
ALTER TABLE Sales.SalesOrderHeader ALTER COLUMN CreditCardApprovalCode NVARCHAR(15);
ALTER TABLE Person.Password ALTER COLUMN PasswordHash NVARCHAR(128);
ALTER TABLE Person.Password ALTER COLUMN PasswordSalt NVARCHAR(10);
然后可以将其从输出网格复制到新的查询窗口并执行
注意:在AdventureWorks
上运行您的原始脚本时,我发现在这种情况下,其中一列是计算的,因此不能简单地使用更改表来修改。。。ALTER COLUMN….
语句-这就是为什么我在这里显示的脚本中排除计算列
如果你真的坚持,你也可以把我的这条SQL语句变成光标的“心脏”,然后迭代T-SQL语句来修改表,并使用
EXEC(…)
或EXEC sp_executesql
执行这些语句。如果你不这样做,你必须创建一个新表,迁移数据并删除原始数据。否则,必须创建一个新表,迁移数据并删除原始数据。+1用于捕获计算列问题。目前需要一个小的更新来处理(max)
length,返回NVARCHAR(-1)
非常好的答案@SqlZim:添加了对处理VARCHAR(MAX)
案例的支持,以及更改case c.MAX_length
条件:案例,当c.MAX_length>4000或c.MAX_length<0时,则“MAX”ELSE强制转换(c.MAX_length作为VARCHAR(5))+;'用于捕获计算列问题的代码>+1。目前需要一个小的更新来处理(max)
length,返回NVARCHAR(-1)
非常好的答案@SqlZim:添加了对处理VARCHAR(MAX)
案例的支持,以及更改case c.MAX_length
条件:案例,当c.MAX_length>4000或c.MAX_length<0时,则“MAX”ELSE强制转换(c.MAX_length作为VARCHAR(5))+;'代码>