デフォルトの照合オプションを使用してSQLServerをインストールした場合、次のクエリが同じ結果を返すことがあります。
CREATE TABLE mytable
(
mycolumn VARCHAR(10)
)
GO
SET NOCOUNT ON
INSERT mytable VALUES('Case')
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
列レベルで照合を強制することにより、クエリを変更できます。
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'caSE'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'case'
SELECT myColumn FROM myTable
WHERE myColumn COLLATE Latin1_General_CS_AS = 'Case'
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'
SELECT DATABASEPROPERTYEX('<database name>', 'Collation')
この設定を変更すると、アプリケーションとSQLクエリに影響を与える可能性があるため、最初にこのテストを分離します。SQL Server 2000から、ALTER TABLEステートメントを簡単に実行して、特定の列の並べ替え順序を変更し、大文字と小文字を区別することができます。まず、次のクエリを実行して、何に戻す必要があるかを判断します。
EXEC sp_help 'mytable'
デフォルトのシナリオでは、2番目のレコードセットに次の情報が含まれている必要があります。
Column_Name照合
mycolumn SQL_Latin1_General_CP1_CI_AS
「照合」列が返すものが何であれ、次の変更を行った後、何に戻す必要があるかがわかります。これにより、大文字と小文字が区別されます。
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE Latin1_General_CS_AS
GO
SELECT mycolumn FROM mytable WHERE mycolumn='Case'
SELECT mycolumn FROM mytable WHERE mycolumn='caSE'
SELECT mycolumn FROM mytable WHERE mycolumn='case'
これで問題が発生した場合は、新しいALTER TABLEステートメントを発行するだけで元に戻すことができます(COLLATE識別子を以前に見つけたものに置き換えてください)。
ALTER TABLE mytable
ALTER COLUMN mycolumn VARCHAR(10)
COLLATE SQL_Latin1_General_CP1_CI_AS
SQL Server 7.0で立ち往生している場合は、この回避策を試すことができます。これは、パフォーマンスに少し影響を与える可能性があります(最初の一致の結果のみを取得する必要があります)。
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('Case' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('caSE' AS VARBINARY(10))
SELECT mycolumn FROM mytable WHERE
mycolumn = 'case' AND
CAST(mycolumn AS VARBINARY(10)) = CAST('case' AS VARBINARY(10))
-- if myColumn has an index, you will likely benefit by adding
-- AND myColumn = 'case'