博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL SERVER修改排序规则——脚本篇
阅读量:6292 次
发布时间:2019-06-22

本文共 28336 字,大约阅读时间需要 94 分钟。

原文:

在上篇中,大致就数据库服务器排序规则(或者叫数据库实例排序规则)、数据库排序规则、列的排序规则粗浅的叙说了一遍,重点讲述了修改数据库服务器排序规则(数据库实例排序规则),其中对于数据库排序规则的修改只是粗略带过。其实相对而言,修改服务器排序规则(数据库实例排序规则)相对简单一些,修改数据库的排序规则就复杂多了,因为涉及到数据、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')

如上所示,修改列的排序规则当中,如果在这个字段上建有索引,那么修改列的排序规则时,就会报上面错误信息。这时需要先删除索引,修改列的排序规则后,然后重建索引。

所以要彻底修改这些列的排序规则,这项工作相当的繁琐和郁闷,还是推荐大家看看这位兄台的的博客,由于这篇博客里面有些脚本没有写全,有些脚本我稍作了修改,例如将生成创建表索引、约束、删除表相关索引、约束的脚本写入表里面。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等表。修改数据库的排序规则完成。

 

转载地址:http://drcta.baihongyu.com/

你可能感兴趣的文章
soapUI学习笔记--用例字段参数化
查看>>
一些通用性的haproxy调优tips
查看>>
Java中泛型的各种使用
查看>>
这些git技能够你用一年了
查看>>
Android开发学习之路--Notification之初体验
查看>>
用友ERP T6技术解析(六) 库龄分析
查看>>
uva 10401 Injured Queen Problem(dp)
查看>>
[LeetCode] Kth Smallest Element in a BST
查看>>
rxlib簡介
查看>>
PEAR安装、管理及使用
查看>>
iOS 6.1完美越狱教程
查看>>
Android Studio无法打开解决方法
查看>>
消息头字段
查看>>
ArrayList和数组间的相互转换
查看>>
微信公众平台——自定义菜单
查看>>
[转]SQL truncate 、delete与drop区别
查看>>
软件的价值
查看>>
一种用户体验-显示对话框时灰化你的主窗体
查看>>
免费超高速卡片式病人基本信息列表控件
查看>>
HDU 3336 Count the string(KMP+DP)
查看>>