更改SQL Server数据库排序

时间:2010-05-30 11:33:42

标签: sql sql-server sql-server-2008 collation

我有一个更改SQL Server数据库排序规则的请求:

  

ALTER DATABASE solarwind95   整理SQL_Latin1_General_CP1_CI_AS

但我得到了这个奇怪的错误:

  

Meldung 5075,Ebene 16,Status 1,   Zeile 1 Das'Spalte'-Objekt   'CustomPollerAssignment.PollerID'ist   von'Datenbanksortierung'abhängig。   Die Datenbanksortierung kann nicht   geändertwerden,wenn ein   schemagebundenes Objekt von ihr   abhängigthet。 Entfernen Sie死了   Anhängigkeitender   Datenbanksortierung,und wiederholen   Sie den Vorgang。

抱歉德国错误消息。我不知道如何将语言切换为英语,但这是一个翻译:

  

翻译:消息5075,第16层,   状态1,行1“列”对象   'CustomPollerAssignment.PollerID'   取决于'数据库排序。该   如果是,则无法更改数据库排序   模式绑定对象依赖于它。   删除数据库的依赖项   sortieren并重试。

我得到了更多这样的错误。

3 个答案:

答案 0 :(得分:3)

您需要从视图和表值函数中删除WITH SCHEMABINDING。要识别它们,您可以查询INFORMATION_SCHEMA次查看:

SELECT TABLE_SCHEMA, TABLE_NAME AS VIEW_NAME
FROM INFORMATION_SCHEMA.VIEWS
WHERE VIEW_DEFINITION LIKE '%SCHEMABINDING%'

SELECT ROUTINE_SCHEMA, ROUTINE_NAME
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%SCHEMABINDING%'
  1. 首先备份数据库。
  2. 生成所有架构绑定视图和函数的ALTER脚本。
  3. 从脚本中删除“WITH SCHEMABINDING”字样。
  4. 运行脚本几次,直到所有参考错误都得到解决。
  5. 更改数据库的排序规则。
  6. 脚本并删除所有约束(键,检查和默认值)。
  7. 使用下面的脚本更改每列的排序规则。
  8. 重新创建约束。
  9. 最后,运行原始脚本几次以启用架构绑定。
  10. 您可以使用此脚本更改所有列的排序规则:

    DECLARE @collation nvarchar(128)
    DECLARE @commands table ([SQL] nvarchar(max))
    DECLARE @cursor cursor
    DECLARE @sql nvarchar(max)
    
    SET @collation = 'SQL_Latin1_General_CP1_CI_AS'
    
    INSERT @commands ([SQL])
    SELECT 'ALTER TABLE ' + QUOTENAME(c.TABLE_SCHEMA) +'.'+ QUOTENAME(c.TABLE_NAME)
        + ' ALTER COLUMN ' + QUOTENAME(c.COLUMN_NAME)
        + ' ' + c.DATA_TYPE
        + ISNULL('(' + LTRIM(STR(c.CHARACTER_MAXIMUM_LENGTH)) + ')', '')
        + ISNULL(' COLLATE ' + @collation, '')
        + ' ' + CASE c.IS_NULLABLE WHEN 'NO' THEN 'NOT ' ELSE '' END + 'NULL'
    FROM INFORMATION_SCHEMA.COLUMNS c
    INNER JOIN INFORMATION_SCHEMA.TABLES t
    ON t.TABLE_SCHEMA = c.TABLE_SCHEMA AND t.TABLE_NAME = c.TABLE_NAME
    WHERE t.TABLE_TYPE = 'BASE TABLE'
    AND c.COLLATION_NAME <> @collation
    
    SET @cursor = CURSOR FOR SELECT [SQL] FROM @commands
    OPEN @cursor
    FETCH NEXT FROM @cursor INTO @sql
    
    WHILE @@FETCH_STATUS = 0
    BEGIN 
        PRINT @sql
        EXEC (@sql)
    
        FETCH NEXT FROM @cursor INTO @sql
    END
    

答案 1 :(得分:1)

这些将是聚簇索引的主键库。对于聚簇索引,记录按列的升序存储,如果更改数据库的排序规则,则需要重新排序所有表。

答案 2 :(得分:0)

在这种情况下,即使删除架构也无法帮助您

更改排序规则需要KB 325335

中描述的步骤

主要适用于SQL Server 2000,但同样的原则适用

  • 脚本裸表
  • 脚本约束,触发器,键等等+所有代码,视图等以供日后使用
  • 在新数据库中创建裸表
  • DTS或SSIS裸数据
  • 应用脚本来创建约束,触发器,键,代码,视图等