2012-10-29 156 views
4

我想在存儲過程插入中使用該列的默認值,這樣我就不必在多個地方重複默認值(它可能會更改... DRY原則)。TSQL從Case語句插入列默認值

的T-SQL INSERT操作有,我可以用如下一個方便的「默認」關鍵字:

Declare @newA varchar(10) 
Set @newA = 'Foo2' 

-- I can use "default" like so... 
Insert into Table_1 (
    A, 
    B) 
Values (
    @newA, 
    default) 

但是,如果我需要做一些有條件的,我似乎無法得到的情況下語句返回'默認'。

-- How do I use 'default' in a case statement? 
INSERT INTO Table_1 (
    A, 
    B) 
VALUES (
    @newA, 
    CASE WHEN (@newA <> 'Foo2') THEN 'bar' ELSE default END) 
-- > yeilds "Incorrect syntax near the keyword 'default'." 

可以插入默認,然後根據需要像這樣更新:

INSERT INTO Table_1 (
    A, 
    B) 
VALUES (
    @newA, 
    default) 
UPDATE Table_1 
SET B = CASE WHEN (A <> 'Foo2') THEN 'bar' ELSE B END 
WHERE ID = SCOPE_IDENTITY() 

但我真的希望有人告訴我「有一個更好的辦法......」

下面是這個例子的表定義,如果它可以幫助...

CREATE TABLE dbo.Table_1 (
    ID int NOT NULL IDENTITY (1, 1), 
    A varchar(10) NULL, 
    B varchar(10) NULL ) 
GO 
ALTER TABLE dbo.Table_1 ADD CONSTRAINT DF_Table_1_A DEFAULT 'A-Def' FOR A 
GO 
ALTER TABLE dbo.Table_1 ADD CONSTRAINT DF_Table_1_B DEFAULT 'B-Def' FOR B 
GO 

回答

3

default只能在VALUES()區塊內使用,這在CASE聲明中似乎不是可接受的值;你可以使用if語句來確定要插入的內容:

DECLARE @newA varchar(10) = 'Foo2' 

IF (@newA <> 'Foo2') 
BEGIN 
    INSERT INTO Table_1 (A, B) 
    SELECT @newA, 'bar' 
END 
ELSE 
BEGIN 
    --If you are using default values, you do not have to specify the column 
    INSERT INTO Table_1 (A) 
    SELECT @newA 
END 

我覺得這是比插入後更新,這樣就只能插入正確的數據插入表中更好。它還將INSERT/UPDATES的數量保持爲1.在使用@@ IDENTITY時,由於範圍限定,您還應該小心。考慮看看SCOPE_IDENTITY()

+0

所以基本上我必須提前將其分開...至少只有一個插入/更新,我不必重複自己的默認值... – DanO

+0

我對SQL團隊感到失望CASE語句的result_expression不能指定等同於'default'的值!或者它可能是插入語句不能很好地處理語法。 – DanO

+0

@DanO它似乎是一個DEFAULT的限制,只能在VALUES()內根據[** INSERT文檔**](http://msdn.microsoft.com/zh-cn/library/ms174335.aspx) –