2012-10-29 44 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) –