如何在 SQL Server 2012 中禁用区分大小写?

Mon*_*gfu 2 collation character-set sql-server-2012 unicode

我尝试collation_namesys.databases. 我正在尝试将 'SQL_Latin1_General_CP1_CS_AS' 更改为 'SQL_Latin1_General_CP1_CI_AS' 以禁用表中的区分大小写。

update d set d.collation_name='SQL_Latin1_General_CP1_CI_AS'
--SELECT name, collation_name 
FROM sys.databases d
WHERE name = 'db_name' 
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:


不允许消息 259,级别 16,状态 1,第 1 行对系统目录进行临时更新。

Sol*_*zky 7

首先,正如您现在看到的,您不能直接更改系统视图中的元数据。但是,您可以使用ALTER DATABASE更改特定数据库的设置:

ALTER DATABASE { database_name  | CURRENT }
  COLLATE collation_name;
Run Code Online (Sandbox Code Playgroud)

请注意,使用CURRENT关键字的选项是在 SQL Server 2012 中引入的。

或者,如果您只想更改特定表中特定字段对所有查询的行为方式(好吧,所有这些都不会用COLLATE子句覆盖字段排序规则——请参阅下面的注释),那么您可以通过更改排序规则来实现仅针对这一领域:

ALTER TABLE [TableName]
  ALTER COLUMN [ColumnName] NVARCHAR(10)
  COLLATE Latin1_General_100_CI_AS
  NOT NULL;
Run Code Online (Sandbox Code Playgroud)

请务必指定该字段当前具有的完全相同的数据类型和 NULL 与 NOT NULL 设置!

现在,请注意您要完成的工作:

  • SQL_不推荐使用以开头的排序规则。您应该使用 Windows 排序规则。在这种情况下,您将使用Latin1_General_100_CI_AS. 该_100系列是最新版本,并在 SQL Server 2008 中引入。

  • 更改数据库的默认排序规则不会更改任何现有表中任何字符串字段的排序规则。它只影响涉及字符串文字和变量的操作,这些操作也不涉及表中已经指定了排序规则的字段。有关在表已存在时更改数据库排序规则的后果的更多详细信息(示例代码显示了真正的影响,包括在字符串字段上连接现有表和新表时可能出现的错误),请在此处查看我的答案:Latin1_General_BIN performance Impact when更改数据库默认排序规则

  • 任何字符串操作,无论是涉及文字、变量还是表中的字段,都可以使用COLLATE子句覆盖默认排序规则。例如:

    SELECT *
    FROM   dbo.SomeTable st
    WHERE  st.SomeField = @StoredProcedureParameter COLLATE Latin1_General_100_CI_AS;
    
    Run Code Online (Sandbox Code Playgroud)

    如果您只关心对某些(不是全部)表的某些(不是全部)查询,那么这是一个很好的起点。

  • 实际用于字符串操作的排序规则是通过查看在何处指定排序规则的各个级别来确定的。有关详细信息,请参阅排序规则优先级