如何更改整个服务器和特定数据库的SQL Server 2008 R2 Express默认排序规则?
有没有办法使用SQL Server Management Studio的可视界面来做到这一点?在“服务器属性”窗口(以及相应的“数据库属性”窗口中),此属性不可用于编辑。
如何更改整个服务器和特定数据库的SQL Server 2008 R2 Express默认排序规则?
有没有办法使用SQL Server Management Studio的可视界面来做到这一点?在“服务器属性”窗口(以及相应的“数据库属性”窗口中),此属性不可用于编辑。
Answers:
是。
您可以更改SQL Server 2008 R2 Express实例和单个数据库的默认排序规则,但这是一项复杂的任务。
可悲的是,没有视觉选项可以通过SSMS进行。
SQL Server 2008支持在以下级别设置排序规则:
服务器
数据库
柱
表达
默认安装设置由Windows系统区域设置确定。可以在安装过程中更改服务器级别的排序规则,也可以在安装之前更改Windows系统的区域设置。更多...
确保您具有重新创建用户数据库及其中所有对象所需的所有信息或脚本。
使用bcp Utility之类的工具导出所有数据。有关更多信息,请参见导入和导出批量数据。
删除所有用户数据库。
重建主数据库,在setup命令的SQLCOLLATION属性中指定新的排序规则
创建所有数据库及其中的所有对象。
导入所有数据。
COLLATION
,在CREATE DATABASE
语句中设置选项。同样,COLLATION
在ALTER DATABASE
语句中设置选项以更改现有数据库的排序规则。
ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;
我做了这样的事情,它确实起作用了,但是您必须牢记指向指向数据类型的索引,因为必须删除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
这是我的第一个回答,请原谅我的混乱
导出所有数据(包括登录名,链接服务器,SQL Agent作业,DB Mail设置等),以及重建实例级数据,以及重新加载所有用户数据,是一项繁重的工作。而且,即使有所有这些,也仍然不能保证可以通过更新数据库的默认排序规则,ALTER DATABASE
因为有几种情况会阻止操作完成(有关详细信息,请参见文档的“更改数据库排序规则”部分ALTER DATABASE
) 。
但是,有一个未记录的方法要容易得多。主要缺点是它不受支持。这并不是说任何事情都会出错,只是如果发生错误,Microsoft将无助于修复它(因为他们从未保证它会工作)。
我说的方法是sqlservr.exe
通过-q {new_collation_name}
开关运行的。除此之外,还有更多的东西,但这是基本思想。此方法仅更新系统元数据,这具有好处和后果,主要是:
好处
ALTER DATABASE
工作的限制缺点
VARCHAR
如果旧排序规则和新排序规则之间的代码页不同,并且存在值值为128-255(0x80-0xFF)的字符,并且这些字符不与新代码中具有相同值的相同字符同时存在,则数据可以更改页。因此,存在数据丢失的可能性,因此需要首先研究您的数据,以确保不存在这种情况。但是,这也意味着在很多情况下,即使代码页发生更改,仅具有0-127值的字符也没有任何危险。有关该sqlservr.exe -q
方法做什么和不做什么的详细说明(包括有关整理在各个级别如何工作的详细信息以及需要注意的潜在问题),请参阅我的文章:
更改实例,数据库和所有用户数据库中所有列的排序规则:可能会出错吗?
如果只改变实例(包括系统数据库:master
,model
,msdb
,和tempdb
)和一个或多个数据库(但不是所有的数据库),只需分离数据库(S)你想从这个操作中排除,然后再重新将其附加整理更新完成后。