如何更改SQL Server排序规则


27

如何更改整个服务器和特定数据库的SQL Server 2008 R2 Express默认排序规则?

有没有办法使用SQL Server Management Studio的可视界面来做到这一点?在“服务器属性”窗口(以及相应的“数据库属性”窗口中),此属性不可用于编辑。


2
如果要更改数据库中所有列的排序规则,请查看此脚本。我自己还没有尝试过,但是我确实为想要这样做的同事找到了它。
贾斯汀·迪林

2
如果要更改数据库的排序规则,请签出此工具:codeproject.com/KB/database/ChangeCollat​​ion.aspx它可与SQL Server 2005和2008一起使用,对我来说,它比在Windows Server 2003上可以找到的脚本更有效。网络。
欧文,

Answers:


25

是。

您可以更改SQL Server 2008 R2 Express实例和单个数据库的默认排序规则,但这是一项复杂的任务。

可悲的是,没有视觉选项可以通过SSMS进行。

SQL Server 2008支持在以下级别设置排序规则:

  • 服务器

  • 数据库

  • 表达

默认安装设置由Windows系统区域设置确定。可以在安装过程中更改服务器级别的排序规则,也可以在安装之前更改Windows系统的区域设置。更多...

设置和更改服务器排序规则-SQL Server 2008

  • 确保您具有重新创建用户数据库及其中所有对象所需的所有信息或脚本。

  • 使用bcp Utility之类的工具导出所有数据。有关更多信息,请参见导入和导出批量数据。

  • 删除所有用户数据库。

  • 重建主数据库,在setup命令的SQLCOLLATION属性中指定新的排序规则

  • 创建所有数据库及其中的所有对象。

  • 导入所有数据。

设置和更改数据库排序规则-SQL Server 2008

  • 创建新数据库时COLLATION,在CREATE DATABASE语句中设置选项。
  • 同样,COLLATIONALTER DATABASE语句中设置选项以更改现有数据库的排序规则。

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

设置和更改列排序规则

  • 即使更改数据库排序规则,某些列排序规则仍将保持不变。在这种情况下,您必须修改各个列的排序规则。

6

确保确实要按照上面的答案“删除”用户数据库。您可能只想“分离”数据库。或实际上,您无能为力,因为重建主数据库会有效地删除到用户数据库的任何链接。有时,数据库是按所需的排序规则创建的,但服务器不是。在这种情况下,您不需要从备份中恢复所有用户数据库。


5

我做了这样的事情,它确实起作用了,但是您必须牢记指向指向数据类型的索引,因为必须删除text / varchar / nvarchar,运行脚本然后创建索引。

USE YourDataBase
GO

DECLARE @Table_Name NVARCHAR(100)
SET @Table_Name = NULL--- THIS IS THE TableName that you want to change its collation columns

--- if null will set to all tables

DECLARE @TempTable AS TABLE
(
ID INT IDENTITY
,TableName NVARCHAR(100)
,ColumnName NVARCHAR(100)
,TypeName NVARCHAR(100)
,Max_length INT
,Collation_Name NVARCHAR(100)
,EnterDtm DATETIME DEFAULT GETDATE()
)
DECLARE @NewCollation NVARCHAR(100)
SET @NewCollation = 'Latin1_General_CI_AS' --- THIS IS THE COLLATION NAME THAT YOU WANT TO CHANGE

INSERT INTO @TempTable(TableName,ColumnName,TypeName,Max_length,Collation_Name)
SELECT 
QUOTENAME(SCHEMA_NAME(tables.schema_id)) + '.' + QUOTENAME(tables.name) AS TableName
,all_columns.name AS ColumnName
,type_name(all_columns.user_type_id)
,all_columns.max_length
,all_columns.collation_name  
from sys.all_columns INNER JOIN sys.tables ON
tables.object_id = all_columns.object_id
AND collation_name IS NOT NULL
AND all_columns.collation_name != @NewCollation
WHERE tables.object_id = ISNULL(object_id(@Table_Name),all_columns.object_id)


DECLARE @TableID SMALLINT
SET @TableID = (SELECT MIN(ID) FROM @TempTable)

DECLARE @Query NVARCHAR(1000),@TableName NVARCHAR(100),@ColumnName NVARCHAR(100),@TypeName NVARCHAR(100)
,@Size INT

WHILE @TableID IS NOT NULL
BEGIN
    SET @TableName = (SELECT TableName FROM @TempTable WHERE ID = @TableID)
    SET @ColumnName = (SELECT QUOTENAME(ColumnName) FROM @TempTable WHERE ID = @TableID)
    SET @TypeName = (SELECT TypeName FROM @TempTable WHERE ID = @TableID)
    SET @Size = (SELECT Max_length FROM @TempTable WHERE ID = @TableID) 

    SET @Query='ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @ColumnName + ' ' + @TypeName+ ISNULL ('(' +CAST(@Size AS VARCHAR(200))+')', '') +' COLLATE '+ @NewCollation  
    PRINT (@Query)

    SET @TableID = (SELECT MIN(ID) FROM @TempTable WHERE ID > @TableID)
END 

这是我的第一个回答,请原谅我的混乱


-1

导出所有数据(包括登录名,链接服务器,SQL Agent作业,DB Mail设置等),以及重建实例级数据,以及重新加载所有用户数据,是一项繁重的工作。而且,即使有所有这些,也仍然不能保证可以通过更新数据库的默认排序规则,ALTER DATABASE因为有几种情况会阻止操作完成(有关详细信息,请参见文档“更改数据库排序规则”部分ALTER DATABASE) 。

但是,有一个未记录的方法容易得多。主要缺点是它不受支持。这并不是说任何事情都会出错,只是如果发生错误,Microsoft将无助于修复它(因为他们从未保证它会工作)。

我说的方法是sqlservr.exe通过-q {new_collation_name}开关运行的。除此之外,还有更多的东西,但这是基本思想。此方法仅更新系统元数据,这具有好处和后果,主要是:

好处

  • 相当快
  • 绕过大多数阻止ALTER DATABASE工作的限制
  • 可能比人们多年来提出并删除和重新创建对象的任何脚本都要准确得多

缺点

  • 如果出现问题,则不受支持
  • VARCHAR如果旧排序规则和新排序规则之间的代码页不同,并且存在值值为128-255(0x80-0xFF)的字符,并且这些字符不与新代码中具有相同值的相同字符同时存在,则数据可以更改页。因此,存在数据丢失的可能性,因此需要首先研究您的数据,以确保不存在这种情况。但是,这也意味着在很多情况下,即使代码页发生更改,具有0-127值的字符也没有任何危险。
  • 用户定义的表类型(UDTT)被跳过,需要手动更新。

有关该sqlservr.exe -q方法做什么和不做什么的详细说明(包括有关整理在各个级别如何工作的详细信息以及需要注意的潜在问题),请参阅我的文章:

更改实例,数据库和所有用户数据库中所有列的排序规则:可能会出错吗?

如果只改变实例(包括系统数据库:mastermodelmsdb,和tempdb)和一个或多个数据库(但不是所有的数据库),只需分离数据库(S)你想从这个操作中排除,然后再重新将其附加整理更新完成后。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.