【问题标题】:Changing SQL Server Database sorting更改 SQL Server 数据库排序
【发布时间】:2011-02-25 16:12:40
【问题描述】:

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

更改数据库 solarwind95 整理 SQL_Latin1_General_CP1_CI_AS

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

Meldung 5075,Ebene 16,状态 1, Zeile 1 Das 'Spalte'-Objekt 'CustomPollerAssignment.PollerID' 列表 von 'Datanbanksortierung' abhängig。 数据银行分期付款 geändert werden, wenn ein 框架内的对象 abhängigist。进入世界 焦虑症 Datenbanksortierung, und wiederholen 西登沃甘。

对于德语错误信息,我们深表歉意。我不知道如何将语言切换为英文,但这里有一个翻译:

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

我遇到了很多类似的错误。

【问题讨论】:

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


    【解决方案1】:

    您需要从视图和表值函数中删除 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. 最后,运行几次原始脚本以启用模式绑定。

    您可以使用此脚本更改所有列的排序规则:

    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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        在这种情况下,即使删除架构绑定也无济于事

        更改排序规则需要KB 325335 中描述的步骤

        主要适用于SQL Server 2000,但原理相同

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

        【讨论】:

        • 您说“删除模式绑定无济于事”。你有什么问题?对我来说效果很好。
        • @Anthony Faull:更改排序规则只会更改系统表。要更改用户表,您必须删除所有依赖项:SCHEMBINDING 只是一个依赖项。因此,答案中的第 6 步不足以更改排序规则,因此对您没有帮助。
        • 你说的很对。我也扩展了我的答案以更改列。
        猜你喜欢
        • 2011-04-08
        • 2014-11-25
        • 2011-11-14
        • 2011-07-19
        • 2012-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-09
        相关资源
        最近更新 更多