SQL Server 2000/2005 データベースのテーブルで大文字と小文字を区別する検索/置換を実行するには、正しい照合順序を使用する必要があります。
データベースの既定の照合順序で大文字と小文字が区別されるかどうかを判断するにはどうすればよいですか? そうでない場合は、大文字と小文字を区別する検索/置換を実行する方法は?
SQL Server 2000/2005 データベースのテーブルで大文字と小文字を区別する検索/置換を実行するには、正しい照合順序を使用する必要があります。
データベースの既定の照合順序で大文字と小文字が区別されるかどうかを判断するにはどうすればよいですか? そうでない場合は、大文字と小文字を区別する検索/置換を実行する方法は?
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'example'
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'EXAMPLE'
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe'
デフォルトの照合で大文字と小文字が区別されると想定しないでください。大文字と小文字を区別するものを毎回指定するだけです (もちろん、言語に適したものを使用してください)。
次のように、デフォルトの照合で大文字と小文字が区別されるかどうかを判断します。
select charindex('RESULT', 'If the result is 0 you are in a case-sensitive collation mode')
0 の結果は大文字と小文字を区別する照合モードであることを示し、8 は大文字と小文字を区別しないことを示します。
照合で大文字と小文字が区別されない場合は、検索/置換を実行するときに使用する照合モードを明示的に宣言する必要があります。
使用する照合モードを指定して、大文字と小文字を区別する検索/置換を実行する UPDATE ステートメントを作成する方法を次に示します。
update ContentTable
set ContentValue = replace(ContentValue COLLATE Latin1_General_BIN, 'THECONTENT', 'TheContent')
from StringResource
where charindex('THECONTENT', ContentValue COLLATE Latin1_General_BIN) > 0
これは と一致して置換しますが、 orは置換'THECONTENT'
しません。'TheContent'
'thecontent'
複数のステートメントで実行できます。置換しようとしている大文字と小文字の両方の単語を含む長い文字列がある場合、これは機能しません。アクセントと大文字と小文字を区別する別の照合を使用する必要がある場合もあります。
UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T,
(SELECT [LanguageCode]
,[StringNo]
,REPLACE([String], 'Favourite','Favorite') ReplacedString
FROM [dbo].[TranslationText]
WHERE
[String] COLLATE Latin1_General_CS_AS like '%Favourite%'
AND [LanguageCode] = 'en-us') US_STRINGS
WHERE
T.[LanguageCode] = US_STRINGS.[LanguageCode]
AND T.[StringNo] = US_STRINGS.[StringNo]
UPDATE T SET [String] = ReplacedString
FROM [dbo].[TranslationText] T,
(SELECT [LanguageCode]
,[StringNo]
, REPLACE([String], 'favourite','favorite') ReplacedString
FROM [dbo].[TranslationText]
WHERE
[String] COLLATE Latin1_General_CS_AS like '%favourite%'
AND [LanguageCode] = 'en-us') US_STRINGS
WHERE
T.[LanguageCode] = US_STRINGS.[LanguageCode]
AND T.[StringNo] = US_STRINGS.[StringNo]
テーブルをクエリするたびに照合を指定するか、テーブルを変更して照合を列に永続的に適用することができます。
クエリ メソッドを実行することを選択した場合は、大文字と小文字を区別しない検索引数も含めると効果的です。それらを含めると、SQL がより効率的な exec プランを選択することがわかります。例えば:
SELECT testColumn FROM testTable
WHERE testColumn COLLATE Latin1_General_CS_AS = 'eXaMpLe'
and testColumn = 'eXaMpLe'
まず、これを確認してください: http://technet.microsoft.com/en-us/library/ms180175(SQL.90).aspx
CI では大文字と小文字が区別されず、CS では大文字と小文字が区別されます。
また、これは便利かもしれません。select * from fn_helpcollations() - サーバーがサポートするすべての照合を取得します。select * from sys.databases - ここには、サーバー上のすべてのデータベースの照合順序を指定する列があります。