2012-05-01 12 views
1

SQL Server 2008の外部キーケース感度

SELECT mycolumn FROM mytable WHERE mycolumn='Case' 
SELECT mycolumn FROM mytable WHERE mycolumn='caSE' 
SELECT mycolumn FROM mytable WHERE mycolumn='case' 

もしmytable.mycolumnが値「CASE」を持っていた...のデータを返す次たとえば、大文字小文字を区別しないデータを持っているSQL Server 2008のそれは可能です外部キーは大文字と小文字が区別されますか?

+0

いいえ、dbの大文字と小文字の区別を知っているからではありませんが、感受性を変えることができるかどうかを知りたいのですが(dbとforeignキーの両方) – david99world

+0

あなたは以下の答えに質問し、 。私はとにかく答えるでしょう:あなたの 'WHERE'節が鍵を伴わない限り、鍵に対する大文字と小文字の区別はありますが、他のデータとのwhere節はできません。キー列の大文字と小文字を区別した照合を設定し、残りのデータは大文字小文字を区別しないままにします。キーを含む節が大文字と小文字の区別を気にしないようにするには(WHERE key COLLATE <いくつかの大文字小文字を区別しない照合> LIKE '%foo%'; ' –

+0

@Siva Iあなたの質問を理解していない。異なる照合順序で異なる列を記述する2つの異なるWHERE句?またはWHERE col_in_collat​​ion_A = col_in_collat​​ion_B?照合の競合と同様に、それに対処する必要があります。任意の列または式に特定の照合順序で解釈させることができます。 –

答えて

6

大文字と小文字の区別は、データベースのcollation settingsによって決まります。

しかし、特定の列の照合設定を変更して、大文字と小文字を区別し、DBの残りの部分は大文字と小文字を区別しないようにすることができます。たとえば、

Nameとのすべての比較では、大文字と小文字が区別されます。

大文字と小文字を区別して照合する大文字と小文字を区別しない比較を実行する1つの方法は、列ごとにクエリの一部としてcollation castを指定することです。また、この方法を使用して即座に照合を変更する場合は、collation precedenceに慣れておくとよいでしょう。ここで、クエリの時点で指定された照合キャストの一例である:

SELECT Name 
FROM MyTable 
WHERE Name = 'CASE' COLLATE SQL_Latin1_General_CP1_CI_AS -- Use case insensitive coll. 

列の照合表デザイナを使用して対話的に変更することができる(大きな画像のために残念)SSMSれる:

enter image description here

+0

FWIWでは、この列に対するクエリの扱い方(例: 'WHERE Name = 'BoB'')は大文字と小文字を区別しませんでした。 –

+0

大文字と小文字を区別しない比較の例で更新されました... –

0

絶対に。多くは、選択されたSQL Serverの照合順序に依存し、その中には大文字と小文字が区別されないものもあります。あなたは、外部キーは大文字と小文字を区別したい場合は

Selecting a SQL Server Collation

3

、そしてちょうど大文字と小文字を区別すること(とそれが参照するキーが同じ照合順序を使用していることを確認してください)する列を設定します。マイケルの答えから照合を借りて:あなたは、同じ列に対するクエリは、大文字と小文字を区別したい場合は

USE tempdb; 
GO 

CREATE TABLE dbo.foo 
( 
    [key] VARCHAR(32) COLLATE SQL_Latin1_General_CP1_CS_AS 
    PRIMARY KEY 
); 

CREATE TABLE dbo.bar 
(
    [key] VARCHAR(32) COLLATE SQL_Latin1_General_CP1_CS_AS 
    FOREIGN KEY REFERENCES dbo.foo([key]) 
); 

INSERT dbo.foo SELECT 'Bob'; 
INSERT dbo.foo SELECT 'bOB'; 
INSERT dbo.foo SELECT 'BOB'; 
GO 

-- fails: 
INSERT dbo.bar SELECT 'bob'; 
GO 

-- succeeds: 
INSERT dbo.bar SELECT 'Bob'; 
GO 

して、あなただけの(それが_CI_代わりの_CS_が含まれています注意してください)COLLATE句を指定することができます。

SELECT COUNT(*) FROM dbo.foo 
    WHERE [key] = 'Bob'; 

---- 
1 

SELECT COUNT(*) FROM dbo.foo 
    WHERE [key] COLLATE SQL_Latin1_General_CP1_CI_AS = 'Bob'; 

---- 
3