一、實例介紹
SQL語句大小寫到底是否區分呢?我們先從下面的這個例子來看一下:
例:
--> 創建表,插入數據:
declare @maco table (number int,myvalue varchar(2)) insert into @maco select 1,'aa' union all select 2,'Aa' union all select 3,'aA' union all select 4,'AA' --不區分大小寫 select * from @maco WHERE nn='aa' --區分大小寫 select * from @maco WHERE nn='aa' collate Chinese_PRC_CS_AI
注:我用的是Sql Server 2005。
從上面的例子我們可以看到第一句不區分,而第二句區分。可是每個語句不能都加上個collate Chinese_PRC_CS_AI吧?
我們可以這樣,看下面的例子:
例:
--不區分大小寫 ALTER TABLE My_table ALTER Column colname nvarchar(100) collate Chinese_PRC_CI_AS --區分大小寫 ALTER TABLE My_table ALTER Column colname nvarchar(100) collate Chinese_PRC_CS_AS
從上面的例子我們可以看到第一句不區分,而第二句區分。可是我們不能每個表都進行一下修改吧?
我們可以再這樣,看下面的例子:
例:
--不區分大小寫 ALTER DATABASE databasename collate Chinese_PRC_CI_AS --區分大小寫 ALTER DATABASE databasename collate Chinese_PRC_CS_AS
批量修改數據庫中所有表內字段大小寫敏感
如:
DECLARE @collate nvarchar(100); DECLARE @table nvarchar(255); DECLARE @column_name nvarchar(255); DECLARE @column_id int; DECLARE @data_type nvarchar(255); DECLARE @max_length int; DECLARE @row_id int; DECLARE @sql nvarchar(max); DECLARE @sql_column nvarchar(max); DECLARE @is_nullable int; DECLARE @nullornot nvarchar(255); SET @collate = 'Chinese_PRC_CS_AS'; --不區分大小寫: Chinese_PRC_CI_AS 區分大小寫 :Chinese_PRC_CS_AS DECLARE local_table_cursor CURSOR FOR SELECT [name] FROM sysobjects WHERE OBJECTPROPERTY(id, N'IsUserTable') = 1 OPEN local_table_cursor FETCH NEXT FROM local_table_cursor INTO @table WHILE @@FETCH_STATUS = 0 BEGIN DECLARE local_change_cursor CURSOR FOR SELECT ROW_NUMBER() OVER (ORDER BY c.column_id) AS row_id , c.name column_name , t.Name data_type , c.max_length , c.column_id , c.is_nullable FROM sys.columns c JOIN sys.types t ON c.system_type_id = t.system_type_id LEFT OUTER JOIN sys.index_columns ic ON ic.object_id = c.object_id AND ic.column_id = c.column_id LEFT OUTER JOIN sys.indexes i ON ic.object_id = i.object_id AND ic.index_id = i.index_id WHERE c.object_id = OBJECT_ID(@table) ORDER BY c.column_id OPEN local_change_cursor FETCH NEXT FROM local_change_cursor INTO @row_id, @column_name, @data_type, @max_length, @column_id,@is_nullable WHILE @@FETCH_STATUS = 0 BEGIN IF (@max_length = -1) OR (@max_length > 4000) SET @max_length = 4000; IF (@is_nullable = 1) SET @nullornot=' not null' ELSE SET @nullornot='' IF (@data_type LIKE '%char%') BEGIN TRY SET @sql = 'ALTER TABLE ' + @table + ' ALTER COLUMN ' + @column_name + ' ' + @data_type + '(' + CAST(@max_length AS nvarchar(100)) + ') COLLATE ' + @collate +' ' +@nullornot PRINT @sql EXEC sp_executesql @sql END TRY BEGIN CATCH PRINT 'ERROR: Some index or constraint rely on the column ' + @column_name + '. No conversion possible.' PRINT @sql END CATCH FETCH NEXT FROM local_change_cursor INTO @row_id, @column_name, @data_type, @max_length, @column_id,@is_nullable END CLOSE local_change_cursor DEALLOCATE local_change_cursor FETCH NEXT FROM local_table_cursor INTO @table END CLOSE local_table_cursor DEALLOCATE local_table_cursor GO
二、參數介紹
Chinese_PRC_指針對大陸簡體字UNICODE的排序規則。
排序規則的后半部份(即后綴)含義:
_BIN 二進制排序_CI(CS) 是否區分大小寫:CI不區分,CS區分
_AI(AS) 是否區分重音:AI不區分,AS區分
_KI(KS) 是否區分假名類型:KI不區分,KS區分
_WI(WS) 是否區分寬度:WI不區分,WS區分
三、整體介紹
在安裝SQL時,我們可以選擇區分大小寫或安裝完以后重建mastar,再選擇區分大小
下面是rebuildm.exe 的路徑:
C:/Program Files/Microsoft SQL Server/80/Tools/Binn/rebuildm.exe
若要修改排序規則,按照上面的參數設置即可。
若只修改一個表,用ALTER TABLE語句
若修改一個庫的默認排序規則,用ALTER DATABASE語句
若修改整個服務器的默認排序規則,用Rebuildm.exe重建master庫