在SQL Server中修改搜索以使其不区分大小写

3
我有一个当前排序方式为French_CI_AS的数据库,这意味着搜索是不区分大小写但区分重音符号。我曾经认为将数据库的排序方式更改为French_CI_AI可以解决我的问题,所以我这样做了。然而,我仍然无法使简单的搜索变得不区分重音符号。我检查表格排序方式是French_CI_AI,这可能是因为它随着数据库一起被更改。
是否有办法使所有数据库对重音符号不敏感?或者有没有办法做到单个搜索重音符号不敏感?我只有一个或两个需要这样做的存储过程,所以我可以选择这种方式。
如果这有任何区别,我的数据类型都是nvarchar(n)。
谢谢。

1
你确定有你期望的排序规则吗?更改数据库不会返回并更改所有现有的列。 - Aaron Bertrand
我不知道列本身有一个排序规则。 我会检查一下。 谢谢。 - David Brunelle
它在一个列上运行正常,所以现在我只需要遍历我用来搜索的所有列,这并不多。谢谢。如果你想要得到荣誉,你可以将你的评论作为答案! - David Brunelle
2个回答

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脚本

您需要决定要更改排序规则的列。可以按类型、名称或特定表进行更改。

您可以从示例中查看列游标,了解您拥有哪种字符类型,并将其替换。

SELECT distinct DATA_TYPE from information_schema.columns

您可以参考此帖子:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接