2013-12-08 109 views
4

我有使用檢查約束,只允許大寫的一組值牛逼SQL CHECK約束,讓大寫的設定值

我的代碼,因爲這創建SQL Server中的表:

CREATE TABLE Client(
    clientID INT IDENTITY(1,1) PRIMARY KEY, 
    FirstName VARCHAR(30) NOT NULL, 
    LastName VARCHAR(30) NOT NULL, 
    StreetAddress VARCHAR(50), 
    Suburb VARCHAR(25), 
    State VARCHAR(4) CHECK (state in ('QLD', 'NSW', 'VIC', 'TAS', 'SA', 'WA', 'NT', 'ACT')), 
    PhoneNumber VARCHAR(10) 
); 

請檢查錯誤並幫助我

+1

你會得到什麼錯誤信息? –

+1

而錯誤是? –

+0

我不認爲有任何錯誤。我猜這個排序規則是不區分大小寫的,並允許輸入小寫字符串,例如'qld'。 – Szymon

回答

7

默認情況下,SQL Server不區分大小寫。您可以將列定義爲案例通過將區分大小寫排序敏感:

declare @t table (state varchar(4) check (state in ('ok', 'computer'))) 
insert @t values ('OK') -- No error, case insensitive by default 
go 
declare @t table (state varchar(4) collate SQL_Latin1_General_CP1_CS_AS 
    check (state in ('ok', 'computer'))) 
insert @t values ('OK') -- The INSERT statement conflicted with the CHECK constraint 

注意CS中SQL_Latin1_General_CP1_ CS _As,這代表區分大小寫。 AS代表Accent Sensitive。

+0

或者,您可以將列保留爲不區分大小寫,並使約束區分大小寫:check (狀態在('ok','computer')中整理SQL_Latin1_General_CP1_CS_AS) –

0
CREATE TABLE Client(
    clientID INT IDENTITY(1,1) PRIMARY KEY, 
    FirstName VARCHAR(30) NOT NULL, 
    LastName VARCHAR(30) NOT NULL, 
    StreetAddress VARCHAR(50), 
    Suburb VARCHAR(25), 
    State VARCHAR(4) CHECK (state in ('QLD', 'NSW', 'VIC', 'TAS', 'SA', 'WA', 'NT', 'ACT')) COLLATE SQL_Latin1_General_CP1_CS_AS , 
    PhoneNumber VARCHAR(10) 
);