在上篇MS SQL 排序规则总结中,大致就数据库服务器排序规则(或者叫数据库实例排序规则)、数据库排序规则、列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库实例排序规则),其中对于数据库排序规则的修改只是粗略带过。其实相对而言,修改服务器排序规则(数据库实例排序规则)相对简单一些,修改数据库的排序规则就复杂多了,因为涉及到数据、SQL脚本等等,例如,一不小心,修改排序规则后,数据当中可能就会出现乱码; 另外,修改数据库排序规则麻烦的是要大量修改相关表的字段的排序规则,如果不用脚本批量处理,那么这项工作想想就让人望而生畏。做这项工作前,一定要做好备份或在测试服务器测试通过后,然后进行数据库排序规则修改。
如果要首先了解一下修改排序规则,首先看看MS SQL 排序规则总结当中的介绍,重复的内容就不做过多介绍了。我们首先来看看,修改排序规则当中会遇到哪些问题吧。
DBMonitor数据库的排序规则为 Chinese_PRC_CI_AS,在数据库中创建TEST表,插入数据后,修改其排序规则为SQL_Latin1_General_CP1_CI_AS,然后
1: USE DBMonitor;
2:
3: GO
4:
5: CREATE TABLE TEST
6:
7: (
8:
9: ID INT ,
10:
11: NAME VARCHAR(12),
12:
13: CITY NVARCHAR(12)
14:
15: )
16:
17: CREATE INDEX IDX_TEST_NAME ON TEST(NAME);
18:
19: CREATE INDEX IDX_TEST_CITY ON TEST(CITY);
20:
21: INSERT INTO TEST
22:
23: …..
24:
25: ALTER DATABASE DBMonitor COLLATE SQL_Latin1_General_CP1_CI_AS
26:
修改排序规则后,你会发现数据库当中,修改排序规则前新建的表,其列的排序规则依然是旧的排序规则,当然,有时候它不会有任何影响,但是有时候也会导致SQL脚本中出现排序规则冲突等错误。
SELECT object_id,name, collation_name FROM sys.columns WHERE object_id =OBJECT_ID('TEST')
如上所示,修改列的排序规则当中,如果在这个字段上建有索引,那么修改列的排序规则时,就会报上面错误信息。这时需要先删除索引,修改列的排序规则后,然后重建索引。
所以要彻底修改这些列的排序规则,这项工作相当的繁琐和郁闷,还是推荐大家看看这位兄台的Easy way to change collation of all database objects in SQL Server的博客,由于这篇博客里面有些脚本没有写全,有些脚本我稍作了修改,例如将生成创建表索引、约束、删除表相关索引、约束的脚本写入表里面。Fix了一些小bug,至于还有没有其它bug,暂时还没有发现,如果大家有发现其它bug,欢迎指出错误。
SQL Script :ScriptDropTableKeys 创建生成指定表的约束、索引的脚本;
1: --USE [DatabaseName]
2: --GO
3:
4: SET ANSI_NULLS ON
5: GO
6:
7: SET QUOTED_IDENTIFIER ON
8: GO
9:
10:
11: IF EXISTS (SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'ScriptCreateTableKeys') AND OBJECTPROPERTY(id, 'IsProcedure') =1)
12: DROP PROCEDURE ScriptCreateTableKeys;
13: GO
14:
15: --================================================================================================================
16: -- ProcedureName : ScriptCreateTableKeys
17: -- Author : Raymund Macaalay
18: -- CreateDate : 2011-09-11
19: -- Description : 生成数据库里指定表的Constraints,Primary Key, Foreign Key, Index的创建脚本.
20: /*****************************************************************************************************************
21: Parameters : 参数说明
22: ******************************************************************************************************************
23: @table_name : 数据库用户表的名字
24: ******************************************************************************************************************
25: Modified Date Modified User Version Modified Reason
26: ******************************************************************************************************************
27: 2013-11-06 Kerry V01.00.00 修改生成脚本的输出方式,将其写入表CreateTableKeys
28: 2013-11-08 Kerry V01.00.01 Fix生成索引的一些bugs:
29: 1: 非唯一索引不生成索引
30: 2:索引type_des为HEAP的索引也会生成。
31: ******************************************************************************************************************/
32:
33: --================================================================================================================
34:
35:
36: CREATE PROC [dbo].[ScriptCreateTableKeys]
37: @table_name SYSNAME
38: AS
39: BEGIN
40: SET NOCOUNT ON
41:
42: --Note: Disabled keys and constraints are ignored
43: --TODO: Drop and re-create referencing XML indexes, FTS catalogs
44:
45: DECLARE @crlf CHAR(2)
46: SET @crlf = CHAR(13) + CHAR(10)
47: DECLARE @version CHAR(4)
48: SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4)
49: DECLARE @object_id INT
50: SET @object_id = OBJECT_ID(@table_name)
51: DECLARE @sql NVARCHAR(MAX)
52:
53: IF @version NOT IN ('2005', '2008')
54: BEGIN
55: RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1)
56: RETURN
57: END
58:
59: SET @sql = '' +
60: 'SELECT ' +
61: 'CASE ' +
62: 'WHEN 1 IN (i.is_primary_key, i.is_unique_constraint) THEN ' +
63: '''ALTER TABLE '' + ' +
64: 'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +
65: 'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +
66: '''ADD '' + ' +
67: 'CASE k.is_system_named ' +
68: 'WHEN 0 THEN ''CONSTRAINT '' + QUOTENAME(k.name) + @crlf ' +
69: 'ELSE '''' ' +
70: 'END + ' +
71: 'CASE k.type ' +
72: 'WHEN ''UQ'' THEN ''UNIQUE'' ' +
73: 'ELSE ''PRIMARY KEY'' ' +
74: 'END + '' '' + ' +
75: 'i.type_desc + @crlf + ' +
76: 'kc.key_columns + @crlf ' +
77: 'ELSE ' +
78: '''CREATE '' + CASE WHEN i.is_unique = 1 THEN '' UNIQUE '' ELSE '''' end + i.type_desc + '' INDEX '' + ' +
79: 'QUOTENAME(i.name) + @crlf + ' +
80: '''ON '' + ' +
81: 'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +
82: 'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +
83: 'kc.key_columns + @crlf + ' +
84: 'COALESCE ' +
85: '( ' +
86: '''INCLUDE '' + @crlf + ' +
87: '''( '' + @crlf + ' +
88: 'STUFF ' +
89: '( ' +
90: '( ' +
91: 'SELECT ' +
92: '( ' +
93: 'SELECT ' +
94: ''','' + @crlf + '' '' + QUOTENAME(c.name) AS [text()] ' +
95: 'FROM sys.index_columns AS ic ' +
96: 'JOIN sys.columns AS c ON ' +
97: 'c.object_id = ic.object_id ' +
98: 'AND c.column_id = ic.column_id ' +
99: 'WHERE ' +
100: 'ic.object_id = i.object_id ' +
101: 'AND ic.index_id = i.index_id ' +
102: 'AND ic.is_included_column = 1 ' +
103: 'ORDER BY ' +
104: 'ic.key_ordinal ' +
105: 'FOR XML PATH(''''), TYPE ' +
106: ').value(''.'', ''VARCHAR(MAX)'') ' +
107: '), ' +
108: '1, ' +
109: '3, ' +
110: ''''' ' +
111: ') + @crlf + ' +
112: ''')'' + @crlf, ' +
113: ''''' ' +
114: ') ' +
115: 'END + ' +
116: '''WITH '' + @crlf + ' +
117: '''('' + @crlf + ' +
118: ''' PAD_INDEX = '' + ' +
119: 'CASE CONVERT(VARCHAR, i.is_padded) ' +
120: 'WHEN 1 THEN ''ON'' ' +
121: 'ELSE ''OFF'' ' +
122: 'END + '','' + @crlf + ' +
123: 'CASE i.fill_factor ' +
124: 'WHEN 0 THEN '''' ' +
125: 'ELSE ' +
126: ''' FILLFACTOR = '' + ' +
127: 'CONVERT(VARCHAR, i.fill_factor) + '','' + @crlf ' +
128: 'END + ' +
129: ''' IGNORE_DUP_KEY = '' + ' +
130: 'CASE CONVERT(VARCHAR, i.ignore_dup_key) ' +
131: 'WHEN 1 THEN ''ON'' ' +
132: 'ELSE ''OFF'' ' +
133: 'END + '','' + @crlf + ' +
134: ''' ALLOW_ROW_LOCKS = '' + ' +
135: 'CASE CONVERT(VARCHAR, i.allow_row_locks) ' +
136: 'WHEN 1 THEN ''ON'' ' +
137: 'ELSE ''OFF'' ' +
138: 'END + '','' + @crlf + ' +
139: ''' ALLOW_PAGE_LOCKS = '' + ' +
140: 'CASE CONVERT(VARCHAR, i.allow_page_locks) ' +
141: 'WHEN 1 THEN ''ON'' ' +
142: 'ELSE ''OFF'' ' +
143: 'END + ' +
144: CASE @version
145: WHEN '2005' THEN ''
146: ELSE
147: ''','' + @crlf + ' +
148: ''' DATA_COMPRESSION = '' + ' +
149: '( ' +
150: 'SELECT ' +
151: 'CASE ' +
152: 'WHEN MIN(p.data_compression_desc) =
153: MAX(p.data_compression_desc)
154: THEN MAX(p.data_compression_desc) ' +
155: 'ELSE ''[PARTITIONS USE
156: MULTIPLE COMPRESSION TYPES]'' ' +
157: 'END ' +
158: 'FROM sys.partitions AS p ' +
159: 'WHERE ' +
160: 'p.object_id = i.object_id ' +
161: 'AND p.index_id = i.index_id ' +
162: ') '
163: END + '+ @crlf + ' +
164: ''') '' + @crlf + ' +
165: '''ON '' + ds.data_space + '';'' + ' +
166: '@crlf + @crlf COLLATE database_default AS [-- Create Candidate Keys] ' +
167: 'FROM sys.indexes AS i ' +
168: 'LEFT OUTER JOIN sys.key_constraints AS k ON ' +
169: 'k.parent_object_id = i.object_id ' +
170: 'AND k.unique_index_id = i.index_id ' +
171: 'CROSS APPLY ' +
172: '( ' +
173: 'SELECT ' +
174: '''( '' + @crlf + ' +
175: 'STUFF ' +
176: '( ' +
177: '( ' +
178: 'SELECT ' +
179: '( ' +
180: 'SELECT ' +
181: ''','' + @crlf + '' '' + QUOTENAME(c.name) AS [text()] ' +
182: 'FROM sys.index_columns AS ic ' +
183: 'JOIN sys.columns AS c ON ' +
184: 'c.object_id = ic.object_id ' +
185: 'AND c.column_id = ic.column_id ' +
186: 'WHERE ' +
187: 'ic.object_id = i.object_id ' +
188: 'AND ic.index_id = i.index_id ' +
189: 'AND ic.key_ordinal > 0 ' +
190: 'ORDER BY ' +
191: 'ic.key_ordinal ' +
192: 'FOR XML PATH(''''), TYPE ' +
193: ').value(''.'', ''VARCHAR(MAX)'') ' +
194: '), ' +
195: '1, ' +
196: '3, ' +
197: ''''' ' +
198: ') + @crlf + ' +
199: ''')'' ' +
200: ') AS kc (key_columns) ' +
201: 'CROSS APPLY ' +
202: '( ' +
203: 'SELECT ' +
204: 'QUOTENAME(d.name) + ' +
205: 'CASE d.type ' +
206: 'WHEN ''PS'' THEN ' +
207: '+ ' +
208: '''('' + ' +
209: '( ' +
210: 'SELECT ' +
211: 'QUOTENAME(c.name) ' +
212: 'FROM sys.index_columns AS ic ' +
213: 'JOIN sys.columns AS c ON ' +
214: 'c.object_id = ic.object_id ' +
215: 'AND c.column_id = ic.column_id ' +
216: 'WHERE ' +
217: 'ic.object_id = i.object_id ' +
218: 'AND ic.index_id = i.index_id ' +
219: 'AND ic.partition_ordinal = 1 ' +
220: ') + ' +
221: ''')'' ' +
222: 'ELSE '''' ' +
223: 'END ' +
224: 'FROM sys.data_spaces AS d ' +
225: 'WHERE ' +
226: 'd.data_space_id = i.data_space_id ' +
227: ') AS ds (data_space) ' +
228: 'WHERE ' +
229: 'i.object_id = @object_id ' +
230: --'AND i.is_unique = 1 ' +
231: 'AND i.type >=1' +
232: --filtered and hypothetical indexes cannot be candidate keys
233: CASE @version
234: WHEN '2008' THEN 'AND i.has_filter = 0 '
235: ELSE ''
236: END +
237: 'AND i.is_hypothetical = 0 ' +
238: 'AND i.is_disabled = 0 ' +
239: 'ORDER BY ' +
240: 'i.index_id '
241:
242: --print @sql;
243: INSERT INTO CreateTableKeys
244: EXEC sp_executesql @sql, N'@object_id INT, @crlf CHAR(2)',
245: @object_id, @crlf
246:
247: INSERT INTO CreateTableKeys
248: SELECT
249: 'ALTER TABLE ' +
250: QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id)) + '.' +
251: QUOTENAME(OBJECT_NAME(fk.parent_object_id)) + @crlf +
252: CASE fk.is_not_trusted
253: WHEN 0 THEN 'WITH CHECK '
254: ELSE 'WITH NOCHECK '
255: END +
256: 'ADD ' +
257: CASE fk.is_system_named
258: WHEN 0 THEN 'CONSTRAINT ' + QUOTENAME(name) + @crlf
259: ELSE ''
260: END +
261: 'FOREIGN KEY ' + @crlf +
262: '( ' + @crlf +
263: STUFF
264: (
265: (
266: SELECT
267: (
268: SELECT
269: ',' + @crlf + ' ' + QUOTENAME(c.name) AS [text()]
270: FROM sys.foreign_key_columns AS fc
271: JOIN sys.columns AS c ON
272: c.object_id = fc.parent_object_id
273: AND c.column_id = fc.parent_column_id
274: WHERE
275: fc.constraint_object_id = fk.object_id
276: ORDER BY
277: fc.constraint_column_id
278: FOR XML PATH(''), TYPE
279: ).value('.', 'VARCHAR(MAX)')
280: ),
281: 1,
282: 3,
283: ''
284: ) + @crlf +
285: ') ' +
286: 'REFERENCES ' +
287: QUOTENAME(OBJECT_SCHEMA_NAME(fk.referenced_object_id)) + '.' +
288: QUOTENAME(OBJECT_NAME(fk.referenced_object_id)) + @crlf +
289: '( ' + @crlf +
290: STUFF
291: (
292: (
293: SELECT
294: (
295: SELECT
296: ',' + @crlf + ' ' + QUOTENAME(c.name) AS [text()]
297: FROM sys.foreign_key_columns AS fc
298: JOIN sys.columns AS c ON
299: c.object_id = fc.referenced_object_id
300: AND c.column_id = fc.referenced_column_id
301: WHERE
302: fc.constraint_object_id = fk.object_id
303: ORDER BY
304: fc.constraint_column_id
305: FOR XML PATH(''), TYPE
306: ).value('.', 'VARCHAR(MAX)')
307: ),
308: 1,
309: 3,
310: ''
311: ) + @crlf +
312: ');
313: GO' +
314: @crlf + @crlf COLLATE database_default AS [-- Create Referencing FKs]
315: FROM sys.foreign_keys AS fk
316: WHERE
317: referenced_object_id = @object_id
318: AND is_disabled = 0
319: ORDER BY
320: key_index_id
321:
322: END
323:
324: GO
325:
326:
SQL Script:ScriptDropTableKeys 创建删除指定表的约束、索引的脚本
1: --USE [DatabaseName]
2: --GO
3:
4:
5: SET ANSI_NULLS ON
6: GO
7:
8: SET QUOTED_IDENTIFIER ON
9: GO
10:
11: IF EXISTS (SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'ScriptDropTableKeys') AND OBJECTPROPERTY(id, 'IsProcedure') =1)
12: DROP PROCEDURE ScriptDropTableKeys;
13: GO
14:
15: --===============================================================================================================
16: -- ProcedureName : ScriptDropTableKeys
17: -- Author : Raymund Macaalay
18: -- CreateDate : 2011-09-11
19: -- Description : 删除数据库里指定表的Constraints,Primary Key, Foreign Key, Index
20: /*****************************************************************************************************************
21: Parameters : 参数说明
22: ******************************************************************************************************************
23: @table_name : 数据库用户表的名字
24: ******************************************************************************************************************
25: Modified Date Modified User Version Modified Reason
26: ******************************************************************************************************************
27: 2013-11-06 Kerry V01.00.00 修改生成脚本的输出方式,将其写入表DropTableKeys
28: 2013-12-08 Kerry V01.00.00 Fix掉脚本中一个小bug: 不生成删除非唯一索引的SQL Script
29: *****************************************************************************************************************/
30:
31: --==============================================================================================================
32:
33: CREATE PROC [dbo].[ScriptDropTableKeys]
34: @table_name SYSNAME
35: AS
36: BEGIN
37: SET NOCOUNT ON
38:
39: --Note: Disabled keys and constraints are ignored
40: --TODO: Drop and re-create referencing XML indexes, FTS catalogs
41:
42: DECLARE @crlf CHAR(2)
43: SET @crlf = CHAR(13) + CHAR(10)
44: DECLARE @version CHAR(4)
45: SET @version = SUBSTRING(@@VERSION, LEN('Microsoft SQL Server') + 2, 4)
46: DECLARE @object_id INT
47: SET @object_id = OBJECT_ID(@table_name)
48: DECLARE @sql NVARCHAR(MAX)
49:
50: IF @version NOT IN ('2005', '2008')
51: BEGIN
52: RAISERROR('This script only supports SQL Server 2005 and 2008', 16, 1)
53: RETURN
54: END
55:
56: INSERT INTO dbo.DropTableKeys
57: SELECT
58: 'ALTER TABLE ' +
59: QUOTENAME(OBJECT_SCHEMA_NAME(parent_object_id)) + '.' +
60: QUOTENAME(OBJECT_NAME(parent_object_id)) + @crlf +
61: 'DROP CONSTRAINT ' + QUOTENAME(name) + ';' +
62: @crlf + @crlf COLLATE database_default AS [-- Drop Referencing FKs]
63: FROM sys.foreign_keys
64: WHERE
65: referenced_object_id = @object_id
66: AND is_disabled = 0
67: ORDER BY
68: key_index_id DESC
69:
70:
71: SET @sql = '' +
72: 'SELECT ' +
73: 'statement AS [-- Drop Candidate Keys] ' +
74: 'FROM ' +
75: '( ' +
76: 'SELECT ' +
77: 'CASE ' +
78: 'WHEN 1 IN (i.is_unique_constraint, i.is_primary_key) THEN ' +
79: '''ALTER TABLE '' + ' +
80: 'QUOTENAME(OBJECT_SCHEMA_NAME(i.object_id)) + ''.'' + ' +
81: 'QUOTENAME(OBJECT_NAME(i.object_id)) + @crlf + ' +
82: '''DROP CONSTRAINT '' + QUOTENAME(i.name) + '';'' + ' +
83: '@crlf + @crlf COLLATE database_default ' +
84: 'ELSE ' +
85: '''DROP INDEX '' + QUOTENAME(i.name) + @crlf + ' +
86: '''ON '' + ' +
87: 'QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + ''.'' + ' +
88: 'QUOTENAME(OBJECT_NAME(object_id)) + '';'' + ' +
89: '@crlf + @crlf COLLATE database_default ' +
90: 'END AS statement, ' +
91: 'i.index_id ' +
92: 'FROM sys.indexes AS i ' +
93: 'WHERE ' +
94: 'i.object_id = @object_id ' +
95: --'AND i.is_unique = 1 ' +
96: ' AND i.type >=1' +
97: --filtered and hypothetical indexes cannot be candidate keys
98: CASE @version
99: WHEN '2008' THEN 'AND i.has_filter = 0 '
100: ELSE ''
101: END +
102: 'AND i.is_hypothetical = 0 ' +
103: 'AND i.is_disabled = 0 ' +
104: ') AS x ' +
105: 'ORDER BY ' +
106: 'index_id DESC;'
107:
108: --PRINT @sql;
109: INSERT INTO dbo.DropTableKeys
110: EXEC sp_executesql @sql,
111: N'@object_id INT, @crlf CHAR(2)',
112: @object_id, @crlf
113:
114: END
115: GO
116:
117:
SQL Script: sp_change_collation_script 创建修改列排序规则的脚本,以及循环调用ScriptDropTableKeys 、ScriptDropTableKeys 生成对应的脚本
1:
2: --USE [DW_ESQUEL]
3: --GO
4:
5:
6: SET ANSI_NULLS ON
7: GO
8:
9: SET QUOTED_IDENTIFIER ON
10: GO
11:
12: IF EXISTS (SELECT 1 FROM sysobjects WHERE id=OBJECT_ID(N'sp_change_collation_script') AND OBJECTPROPERTY(id, 'IsProcedure') =1)
13: DROP PROCEDURE sp_change_collation_script;
14: GO
15:
16: --===============================================================================================
17: -- ProcedureName : sp_change_collation_script
18: -- Author : Kerry
19: -- CreateDate : 2013-11-6
20: -- Description : 组合、补全Raymund Macaalay的脚本,生成改变列排序规则的脚本
21: /*************************************************************************************************
22: Parameters : 参数说明
23: **************************************************************************************************
24: @table_name : 数据库用户表的名字
25: **************************************************************************************************
26: Modified Date Modified User Version Modified Reason
27: **************************************************************************************************
28: 2013-11-6 Kerry V01.00.00
29: *************************************************************************************************/
30:
31: --===============================================================================================
32: CREATE PROCEDURE [dbo].[sp_change_collation_script]
33: @CollationName SYSNAME
34: AS
35: BEGIN
36:
37: SET NOCOUNT ON
38: DECLARE @SQLText VARCHAR(MAX) ;
39: DECLARE @TableName NVARCHAR(255);
40: DECLARE @ColumnName sysname ;
41: DECLARE @DataType NVARCHAR(128);
42: DECLARE @CharacterMaxLen INT ;
43: DECLARE @IsNullable VARCHAR(3) ;
44: DECLARE @CreateSqlRowNum INT;
45: DECLARE @DropSqlRowNum INT;
46:
47: DECLARE MyTableCursor Cursor
48: FOR
49: SELECT name FROM sys.tables WHERE [type] = 'U' and name <> 'sysdiagrams' ORDER BY name
50:
51:
52: IF NOT EXISTS ( SELECT 1
53: FROM dbo.sysobjects
54: WHERE id = OBJECT_ID(N'[dbo].[ChangeColCollation]')
55: AND xtype = 'U' )
56: BEGIN
57:
58: CREATE TABLE [dbo].[ChangeColCollation] ( SQL_TEXT VARCHAR(MAX) )
59: END
60: ELSE
61: TRUNCATE TABLE [dbo].[ChangeColCollation];
62:
63:
64: OPEN MyTableCursor;
65: FETCH NEXT FROM MyTableCursor INTO @TableName
66:
67:
68: WHILE @@FETCH_STATUS = 0
69: BEGIN
70: DECLARE MyColumnCursor Cursor
71: FOR
72: SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
73: IS_NULLABLE from information_schema.columns
74: WHERE table_name = @TableName AND (Data_Type LIKE '%char%'
75: OR Data_Type LIKE '%text%') AND COLLATION_NAME <> @CollationName
76: ORDER BY ordinal_position
77: Open MyColumnCursor
78:
79: FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType,
80: @CharacterMaxLen, @IsNullable
81: WHILE @@FETCH_STATUS = 0
82: BEGIN
83: SET @SQLText = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN [' + @ColumnName + '] ' +
84: @DataType + '(' + CASE WHEN @CharacterMaxLen = -1 THEN 'MAX' ELSE CAST(@CharacterMaxLen AS VARCHAR(6)) END +
85: ') COLLATE ' + @CollationName + ' ' +
86: CASE WHEN @IsNullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END
87: --PRINT @SQLText
88:
89: INSERT INTO ChangeColCollation
90: VALUES (@SQLText);
91:
92: FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType,
93: @CharacterMaxLen, @IsNullable
94: END
95: CLOSE MyColumnCursor
96: DEALLOCATE MyColumnCursor
97:
98: FETCH NEXT FROM MyTableCursor INTO @TableName
99: END
100: CLOSE MyTableCursor
101: --DEALLOCATE MyTableCursor
102:
103:
104: IF NOT EXISTS ( SELECT 1
105: FROM dbo.sysobjects
106: WHERE id = OBJECT_ID(N'[dbo].[CreateTableKeys]')
107: AND xtype = 'U' )
108: BEGIN
109:
110: CREATE TABLE [dbo].[CreateTableKeys] ( SQL_TEXT VARCHAR(MAX) )
111: END
112: ELSE
113: TRUNCATE TABLE [dbo].[CreateTableKeys];
114:
115:
116:
117: IF NOT EXISTS ( SELECT 1
118: FROM dbo.sysobjects
119: WHERE id = OBJECT_ID(N'[dbo].[DropTableKeys]')
120: AND XTYPE = 'U' )
121: BEGIN
122: CREATE TABLE dbo.DropTableKeys ( SQL_TEXT VARCHAR(MAX) )
123: END
124: ELSE
125: TRUNCATE TABLE dbo.DropTableKeys;
126:
127:
128:
129: OPEN MyTableCursor
130:
131: FETCH NEXT FROM MyTableCursor INTO @TableName
132: PRINT @TableName
133: WHILE @@FETCH_STATUS = 0
134: BEGIN
135:
136: EXEC ScriptCreateTableKeys @TableName --生成创建约束、索引等的脚本
137: EXEC ScriptDropTableKeys @TableName --生成删除约束、索引等的脚本
138: FETCH NEXT FROM MyTableCursor INTO @TableName
139: END
140: CLOSE MyTableCursor
141: DEALLOCATE MyTableCursor
142:
143:
144: SELECT @CreateSqlRowNum = COUNT(1) FROM dbo.CreateTableKeys;
145: SELECT @DropSqlRowNum = COUNT(1) FROM dbo.DropTableKeys;
146:
147: IF @CreateSqlRowNum != @DropSqlRowNum
148: PRINT 'The table CreateTableKeys rows is different from the row of DropTableKeys ,please check the reason'
149:
150:
151: END
152: GO
修改数据库的排序规则时,按如下步骤顺序执行SQL
1:
2: ALTER DATABASE DataBase COLLATE Chinese_PRC_CI_AS
3:
4: EXEC sp_change_collation_script 'Chinese_PRC_CI_AS';
5:
6: --执行下表里面的SQL语句
7: SELECT * FROM dbo.DropTableKeys
8:
9: --执行下表里面的SQL语句
10: SELECT * FROM ChangeColCollation
11:
12: --执行下表里面的SQL语句
13: SELECT * FROM dbo.CreateTableKeys
最后验证没有问题后,可以删除dbo.CreateTableKeys、dbo.DropTableKeys、dbo.ChangeColCollation等表。修改数据库的排序规则完成。