代码之家  ›  专栏  ›  技术社区  ›  Shimmy Weitzhandler 500 - Internal Server Error

无法更新sys.columns-是否有其他方法?

  •  1
  • Shimmy Weitzhandler 500 - Internal Server Error  · 技术社区  · 14 年前

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

    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.
    

    更新

    3 回复  |  直到 14 年前
        1
  •  4
  •   AdaTheDev    14 年前

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

    例如

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

    退房 this MSDN reference

        2
  •  2
  •   Andomar    14 年前

    alter table 更改每列的排序规则。

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

        3
  •  2
  •   Shimmy Weitzhandler 500 - Internal Server Error    14 年前

    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)
    

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