3

現在の照合順序が French_CI_AS であるデータベースがあります。つまり、検索では大文字と小文字は区別されませんが、アクセントは区別されます。データベースの照合をFrench_CI_AIに変更すると問題が解決するという印象があったので、そうしました。ただし、単純な検索をアクセントを区別しないようにすることはまだできません。確認すると、テーブルの照合順序は French_CI_AI です。これは、データベースと共に変更されたためと思われます。

すべてのデータベースで Accent insensitive を使用して検索を可能にする方法はありますか? または、そのように単一の検索を行う方法はありますか? それを必要とするストアド プロシージャは 1 つまたは 2 つしかないので、その方法に進むことができます。

違いが生じる場合に備えて、私が探すデータ型はすべて nvarchar(n) です。

ありがとう

4

2 に答える 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';
于 2012-07-24T13:27:46.697 に答える
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-Collat​​ion-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
于 2013-12-19T18:36:02.873 に答える