将SQL Server数据库中的所有varchar列更改为nvarchar

时间:2016-12-23 17:36:26

标签: sql sql-server sql-server-2008 sql-server-2012

我正在尝试将数据库中的所有LastRow = have.Cells(have.Rows.Count, "A").End(xlUp).Row Dim p As Long pp = 3 For p = 1 To LastRow want.Range("A" & pp) = have.Range("A" & p).Value pp = pp + 1 want.Range("A" & pp) = have.Range("A" & p).Value pp = pp + 1 want.Range("A" & pp) = have.Range("A" & p).Value pp = pp + 1 Next p 列更新为varchar而不会丢失数据。

我有以下查询:

nvarchar

如何修改它以更新它找到的列并将其反映在整个数据库中?

1 个答案:

答案 0 :(得分:4)

我会使用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 TABLE ... ALTER COLUMN ....语句 - 这就是我在此处显示的脚本中排除计算列的原因。

如果你真的坚持,你也可以把我的这个SQL语句变成" heart" 游标然后迭代T-SQL语句以修改表,并使用EXEC(...)EXEC sp_executesql

执行这些表