Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQL Server数据库中的所有varchar列更改为nvarchar_Sql_Sql Server_Sql Server 2008_Sql Server 2012 - Fatal编程技术网

将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))+;'