我们在管理不同的客户数据库方面遇到了困难:
我们需要将主键列从VARCHAR(20)
更改为VARCHAR(40)
而不更改排序规则 。这背后的原因是我们使用不区分大小写的默认排序规则,我们要更改的列是区分大小写的,需要保持这种方式。
通常这没有问题,我们可以告诉它保持区分大小写的排序规则:
ALTER TABLE Commiss
ALTER COLUMN CommissName VARCHAR(40)
COLLATE Latin1_General_CS_AS NOT NULL;
但是,我们的一些客户有不同的默认排序规则(法语,中文,...)。到目前为止,我们总是可以为所有客户使用相同的更新脚本。现在,我们需要在更新架构之前将所有ALTER COLUMN
语句更改为正确的排序规则。
所以我的问题是:有没有办法告诉SQL Server改变数据类型并保留此列的现有排序规则。 或者,我们也可以做这样的事情:
ALTER TABLE Commiss
ALTER COLUMN CommissName VARCHAR(40)
COLLATE CS_AS NOT NULL;
如此有效地保持语言不变并仅“改变”区分大小写。
谢谢!
答案 0 :(得分:2)
不幸的是,不是直接在ALTER TABLE中
您可以从sys.columns生成这些语句:
DECLARE @sql nvarchar(1000);
SELECT
@sql = 'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(c.object_id) + '.' + OBJECT_NAME(c.object_id)) +
' ALTER COLUMN ' + QUOTENAME(C.name) + ' VARCHAR(40)
COLLATE ' + c.collation_name + ' NOT NULL;'
FROM
sys.columns C
WHERE
c.object_id = OBJECT_ID('dataenum.host')
AND
C.name = 'hostname';
SELECT @sql;
--EXEC (@sql);