如何更改 SQL Server 排序规则

rem*_*rem 27 sql-server-2008 sql-server collation

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

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

Cod*_*awk 25

是的。

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

遗憾的是,没有通过 SSMS 执行此操作的视觉选项。

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

  • 服务器

  • 数据库

  • 柱子

  • 表达

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

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

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

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

  • 删除所有用户数据库。

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

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

  • 导入所有数据。

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

  • 创建新数据库时COLLATIONCREATE DATABASE语句中设置选项。

  • 同样,COLLATIONALTER DATABASE语句中设置选项以更改现有数据库的排序规则。

    ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;

设置和更改列排序规则

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


And*_*SQL 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 
Run Code Online (Sandbox Code Playgroud)

这是我发布的第一个答案,请原谅我的烂摊子