我有一个数据库,其当前排序规则是French_CI_AS,这意味着搜索不区分大小写,但非常敏感。我的印象是将数据库的排序规则更改为French_CI_AI可以解决我的问题所以我做到了。但是,我仍然无法进行简单的搜索工作Accent-Insensitive。我检查并且表格排序是French_CI_AI,这可能是因为它随着数据库一起被更改。
是否有某种方法可以在所有数据库上使用Accent不敏感进行搜索?或者有没有办法以这种方式进行单一搜索?我只有一两个需要的存储过程,所以我可以这样做。
如果它有任何差异,我寻找的数据类型都是nvarchar(n)s。
由于
答案 0 :(得分: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';
答案 1 :(得分: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脚本您需要决定要更改排序规则的列。它可以是类型,名称或特定表格。
您可以先查看您所拥有的类型的类型,然后在示例中替换它们,请参阅列光标。
从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