1

我刚刚发现,由于我在具有不同排序规则的不同服务器上创建了我的数据库,然后迁移到具有新排序规则的新服务器,现在我一直遇到问题,我决定更改旧排序规则的所有值.

所以我尝试执行这个查询:

sp_configure "Allow Updates", 1
GO
RECONFIGURE WITH OVERRIDE
GO

UPDATE sys.columns SET collation_name = 
    'SQL_Latin1_General_CP1_CI_AS' WHERE collation_name = 'Hebrew_CI_AS'
GO

sp_configure "Allow Updates", 0
GO
RECONFIGURE
GO

但这里是查询的输出:

Configuration option 'allow updates' changed from 0 to 1. 
    Run the RECONFIGURE statement to install.

Msg 259, Level 16, State 1, Line 2
Ad hoc updates to system catalogs are not allowed.

Configuration option 'allow updates' changed from 1 to 0. 
    Run the RECONFIGURE statement to install.

更新
根据下面的答案,我只是在寻找一种自动执行操作的方法。

4

3 回答 3

4

您需要发出 ALTER TABLE 命令以更改特定列的排序规则。

例如

ALTER TABLE YourTable 
ALTER COLUMN ColA VARCHAR(10) COLLATE Latin1_General_CI_AS NOT NULL

查看此 MSDN 参考

于 2010-10-25T20:13:24.150 回答
2

此查询生成一个脚本,将所有Hebrew_CI_AS整理的列交换为Latin1_General_CI_AS整理:

DECLARE @Script varchar(MAX)
SET @Script = CAST((
SELECT 'ALTER TABLE [' + Tables.Name + '] ALTER COLUMN [' + 
  [Columns].Name + '] ' + Types.Name + '(' + 
  CAST([Columns].max_length AS varchar) + ') COLLATE Latin1_General_CI_AS ' + 
  CASE WHEN [Columns].is_nullable = 0 THEN 'NOT ' ELSE '' END + 'NULL '
FROM sys.tables Tables INNER JOIN sys.all_columns [Columns]
  ON [Tables].[object_id] = [Columns].[object_id]
  INNER JOIN sys.types Types ON [Columns].system_type_id = Types.system_type_id
WHERE [Columns].collation_name = 'Hebrew_CI_AS'
FOR XML PATH('')
) AS varchar(MAX))

PRINT @Script
EXEC(@Script)

注意:对于索引/约束的列,您需要手动编辑,但这也是因为在执行上述查询时错误结果(对于约束等)包含表和列名,您必须承认它仍然比手动做所有事情要好。

于 2010-10-25T22:35:50.140 回答
2

您可以使用alter table更改每列的排序规则。

更改数据库排序规则的唯一方法是删除并重新创建数据库。

于 2010-10-25T20:12:07.163 回答