54

SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?私は以前にクエリを実行していました:

SELECT CASE WHEN 'A' = 'a' THEN 'NOT CASE SENSITIVE' ELSE 'CASE SENSITIVE' END

しかし、これは過去に実際に私に問題を与えたので、私は他の方法を探しています。

編集-もう少し情報:既存の製品には、事前に作成された多くのストアドプロシージャがあります。@test != @TESTサーバー自体の感度に応じたストアドプロシージャ。したがって、私が探しているのは、サーバーの感度をチェックするための最良の方法です。

4

7 に答える 7

78

照合はさまざまなレベルで設定できます。

  1. サーバ
  2. データベース

したがって、大文字と小文字を区別しないデータベースに大文字と小文字を区別する列を含めることができます。単一列のデータの大文字と小文字を区別するビジネスケースを作成できる状況はまだ発生していませんが、発生する可能性があると思います。

サーバー照合を確認する

SELECT SERVERPROPERTY('COLLATION')

データベース照合を確認する

SELECT DATABASEPROPERTYEX('AdventureWorks', 'Collation') SQLCollation;

列の照合を確認する

select table_name, column_name, collation_name
from INFORMATION_SCHEMA.COLUMNS
where table_name = @table_name
于 2009-09-11T14:32:21.887 に答える
35

デフォルトの照合オプションを使用して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' 
于 2009-09-11T15:07:36.703 に答える
11

SQL Serverは、大文字と小文字の区別を。によって決定しますCOLLATION

COLLATIONさまざまなレベルで設定できます。

  1. サーバーレベル
  2. データベースレベル
  3. 列レベル
  4. 発現レベル

これがMSDNリファレンスです。

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

照合のリストはここにあります。

于 2015-04-21T12:40:00.720 に答える
4

あなたは照合に興味があります。このスニペットに基づいて何かを構築できます。

SELECT DATABASEPROPERTYEX('master', 'Collation');


編集に基づいて更新@test— 2つの異なる変数を参照できる場合、@TESTそれはSQLServerではありません。同じ変数がそれ自体と等しくないという問題が発生した場合は、その変数がであるかどうかを確認してください。これは、 `falseを返すNULLためです。NULL = NULL

于 2009-09-11T14:21:57.827 に答える
2

すでに作成されているテーブルを操作する最良の方法は、SQLServerクエリエディターに移動することです。

タイプ:sp_help <tablename>

これにより、テーブルの構造が表示されます。COLLATE列の下の目的のフィールドの詳細を参照してください。

次に、次のようなクエリを入力します。

SELECT myColumn FROM myTable  
WHERE myColumn COLLATE SQL_Latin1_General_CP1_CI_AS = 'Case'

異なる文字スキーマ< SQL_Latin1_General_CP1_CI_AS>である可能性があるため、その列に対して使用されている正確なスキーマを確認することをお勧めします。

于 2014-07-18T10:33:17.423 に答える
1

SQL Serverのデータベースで大文字と小文字が区別されるかどうかを確認するにはどうすればよいですか?

以下のクエリを使用して、通知されたデータベースで大文字と小文字が区別されるかどうか、またはバイナリソート(結果がnull)であることが返されます。

;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情報をお読みください;)。

于 2016-12-21T15:37:21.743 に答える
-3

SQLServerでは大文字と小文字は区別されません。SELECT * FROM SomeTableと同じSeLeCT * frOM soMetaBLeです。

于 2009-09-11T14:20:58.420 に答える