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
创建新数据库时COLLATION在CREATE DATABASE语句中设置选项。
同样,COLLATION在ALTER DATABASE语句中设置选项以更改现有数据库的排序规则。
ALTER DATABASE [database_name] COLLATE SQL_Latin1_General_CP1_CI_AS;
确保您真的想“删除”用户数据库,如上面的答案中所述。您可能只想“分离”数据库。或者实际上,您无能为力,因为重建主服务器会有效地删除任何指向用户数据库的链接。有时,数据库是以所需的排序规则创建的,但服务器不是。在这种情况下,您不希望必须从备份中恢复所有用户数据库。
小智 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)
这是我发布的第一个答案,请原谅我的烂摊子