2012-07-24 62 views
3

我有一個數據庫,其當前整理是French_CI_AS,這意味着搜索不區分大小寫,但重音敏感。我的印象是,將數據庫整理到French_CI_AI將解決我的問題,所以我做到了。但是,我仍然無法做一個簡單的搜索工作Accent-Insensitive。我檢查並且表格整理是French_CI_AI,這可能是因爲它隨數據庫一起更改。修改搜索,使其對SQL Server的強調不敏感

是否有某種方法使Accent在所有數據庫上都不敏感?或者有什麼辦法可以用這種方式進行單一搜索?我只有一個或兩個存儲過程需要,所以我可以這樣做。

如果它使任何差異,數據類型我找都爲nvarchar(N)秒。

感謝

+1

你確定*列*有你所期望的排序規則?更改數據庫不會返回並更改所有現有的列。 – 2012-07-24 13:25:36

+0

我不知道列本身有一個整理。我會檢查的。謝謝 – 2012-07-24 13:27:45

+0

它使用了一列,所以我現在要做的就是瀏覽所有用來搜索的列,這並不是很多。謝謝。如果您想獲得學分,您可以將您的評論作爲答案! – 2012-07-24 13:30:17

回答

4

你可以讓任何你想要整理的搜索使用,例如

WHERE column COLLATE FRENCH_CI_AI LIKE '%something%' COLLATE FRENCH_CI_AI 

但是我懷疑它會更好地工作,如果你真的修復列(當你改變數據庫排序時沒有發生)。離開了任何限制等的依賴,如何解決這個問題的答案很簡單:

ALTER TABLE dbo.foo ADD newcol NVARCHAR(32) COLLATE FRENCH_CI_AI; 

UPDATE dbo.foo SET newcol = oldcol; 

ALTER TABLE dbo.foo DROP COLUMN oldcol; 

EXEC sp_rename N'dbo.foo.newcol', N'oldcol', 'COLUMN'; 
0

首先,換款數據庫排序規則不表影響現有列,但會影響到新創建的表和列。這是在數據庫中創建新對象時使用的默認排序規則。

所以,你要做的是找到所有現有的列和更新當前的排序規則。

您可以使用SQL遊標做到這一點,並查詢特定類型或列名的所有表和列和更新排序規則。

例如:

1)更改歸類爲未來的對象

USE master; 
GO 
ALTER DATABASE databasename COLLATE French_CI_AI ; 
GO 

2)手動更改列排序規則爲特定列

ALTER TABLE tablenameX ALTER COLUMN LastName varchar(100) COLLATE French_CI_AI NULL 
ALTER TABLE tablenameY ALTER COLUMN FirstName varchar(100) COLLATE French_CI_AI NULL 

3)生成一個SQL腳本用光標

您需要決定要更改coltiti的列上。它可以按類型,名稱或特定表格。

您可以通過查看至極類型必須和在例如替換它們卡拉科特類型的啓動,請參閱列光標。

選擇INFORMATION_SCHEMA.COLUMNS

你可以參考這個帖子不同的DATA_TYPE:

http://www.codeproject.com/Articles/302405/The-Easy-way-of-changing-Collation-of-all-Database

declare @CollationName as nvarchar = 'Latin1_General_CI_AS' 

declare @tablename as nvarchar(100) = '' 
declare @sqltext as nvarchar(100) = '' 
declare @columnname as nvarchar(200) = '' 
declare @DataType as nvarchar(100) = '' 
declare @CharacterMaxLen as int = 0 
declare @IsNullable as bit = 0 

DECLARE MyTableCursor Cursor 
FOR 
SELECT * from information_schema.TABLES 
      WHERE TABLE_TYPE = 'BASE TABLE' 
OPEN MyTableCursor 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
     DECLARE MyColumnCursor Cursor 
     FOR 
     SELECT COLUMN_NAME,DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, 
      IS_NULLABLE from information_schema.columns 
      WHERE table_name = @TableName AND (Data_Type LIKE '%char%' 
      OR Data_Type LIKE '%text%') AND COLLATION_NAME <> @CollationName 
      ORDER BY ordinal_position 
     Open MyColumnCursor 

     FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, 
       @CharacterMaxLen, @IsNullable 
     WHILE @@FETCH_STATUS = 0 
      BEGIN 
      SET @SQLText = 'ALTER TABLE ' + @TableName + ' ALTER COLUMN [' + @ColumnName + '] ' + 
       @DataType + '(' + CASE WHEN @CharacterMaxLen = -1 THEN 'MAX' ELSE @CharacterMaxLen END + 
       ') COLLATE ' + @CollationName + ' ' + 
       CASE WHEN @IsNullable = 'NO' THEN 'NOT NULL' ELSE 'NULL' END 
      PRINT @SQLText 

     FETCH NEXT FROM MyColumnCursor INTO @ColumnName, @DataType, 
       @CharacterMaxLen, @IsNullable 
     END 
     CLOSE MyColumnCursor 
     DEALLOCATE MyColumnCursor 

FETCH NEXT FROM MyTableCursor INTO @TableName 
END 
CLOSE MyTableCursor 
DEALLOCATE MyTableCursor