SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?以前にクエリを実行しました:
SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END
しかし、これは実際に過去の問題を与えてくれたので、他の方法を探しています。
編集-もう少し情報:既存の製品には、多くの事前に作成されたストアドプロシージャがあります。ストアドプロシージャ@test != @TEST
サーバー自体の感度に依存します。したがって、私が探しているのは、サーバーの感度をチェックする最良の方法です。
照合はさまざまなレベルで設定できます。
したがって、大文字と小文字を区別しないデータベースに大文字と小文字を区別する列を作成できます。単一のデータ列の大文字と小文字を区別するビジネスケースを作成できる状況にはまだ遭遇していませんが、可能性があると思います。
サーバー照合を確認
SELECT SERVERPROPERTY('COLLATION')
データベース照合を確認
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
列の照合を確認
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
SQL Serverをデフォルトの照合オプションでインストールした場合、次のクエリが同じ結果を返すことがあります。
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'
SQLサーバーは、COLLATION
によって大文字と小文字を区別します。
COLLATION
はさまざまなレベルで設定できます。
Raj Moreの答え で述べたように、各レベルでCOLLATION
を確認できます。
サーバー照合をチェック
SELECT SERVERPROPERTY('COLLATION')
データベース照合のチェック
SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;
列の照合をチェック
select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
式照合をチェック
式レベルCOLLATION
の場合、式を調べる必要があります。 :)
以下の例のように、通常は式の最後になります。
SELECT name FROM customer ORDER BY name COLLATE Latin1_General_CS_AI;
照合の説明
各COLLATION
値の説明を取得するには、これを試してください。
SELECT * FROM fn_helpcollations()
そして、あなたはこのような何かを見るはずです。
WHERE
句をいつでも配置して、COLLATION
の説明のみをフィルタリングおよび表示できます。
照合リスト ここ を見つけることができます。
照合に興味があります。このスニペットに基づいて何かを構築できます:
SELECT DATABASEPROPERTYEX('master', 'Collation');
更新
編集内容に基づく— @test
と@TEST
が2つの異なる変数を参照できる場合、それはSQL Serverではありません。 same変数がそれ自体と等しくない問題が発生した場合は、NULL = NULL
が返されるため、その変数がNULL
であるかどうかを確認してください。 `false。
作成済みのテーブルを操作する最良の方法は、SQL Serverクエリエディターに移動することです。
タイプ:sp_help <tablename>
これにより、テーブルの構造が表示されます。COLLATE列の下にある目的のフィールドの詳細を参照してください。
次に、クエリを次のように入力します。
SELECT myColumn FROM myTable
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'
異なる文字スキーマ<SQL_Latin1_General_CP1_CI_AS
>、その列に対して使用された正確なスキーマを見つける方が良い。
SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?
情報に基づいたデータベースを返す以下のクエリを使用できます。
;WITH collations AS (
SELECT
name,
CASE
WHEN description like '%case-insensitive%' THEN 0
WHEN description like '%case-sensitive%' THEN 1
END isCaseSensitive
FROM
sys.fn_helpcollations()
)
SELECT *
FROM collations
WHERE name = CONVERT(varchar, DATABASEPROPERTYEX('yourDatabaseName','collation'));
詳細については このMSDN情報 ;)を参照してください。