3

我们在管理不同的客户数据库时遇到了困难:

我们需要在不更改排序规则的情况下将主键列从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;

如此有效地保持语言原样,并且只会“改变”区分大小写。

谢谢!

4

1 回答 1

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);
于 2013-05-22T09:52:55.257 回答