更改列而不更改排序规则

时间:2013-05-22 09:07:32

标签: sql sql-server collation

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

我们需要将主键列从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;

如此有效地保持语言不变并仅“改变”区分大小写。

谢谢!

1 个答案:

答案 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);
相关问题