我正在尝试将数据库中的所有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
如何修改它以更新它找到的列并将其反映在整个数据库中?
答案 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