有没有办法在INSERT..SELECT语句中有条件地使用默认列值?

时间:2010-03-02 20:41:54

标签: sql tsql sql-server-2008 insert column-defaults

我在一个存储过程中有一个类似于以下代码,在表中插入一行,我想将最后一列(FieldD)设置为@prmSomeValue,除非它为null,否则只使用默认值为该列定义。

IF (@prmSomeValue IS NULL)
   INSERT INTO MyTable (fieldA,FieldB,FieldC)  
      SELECT A,B,C 
      FROM MyOtherTable
ELSE
   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,@prmSomeValue 
      FROM MyOtherTable

这有效,但违反了DRY原则。我试图用一个插入语句找到一些方法来做到这一点。类似于以下伪代码的东西。

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,DEFAULT)
      FROM MyOtherTable

有人有什么想法吗?

更新 - 再转一次
默认约束不是文字值,而是如下所示的函数。

...DEFAULT (suser_sname()) FOR [FieldD]

更新
我终于发了誓并选择了较小的邪恶,只是将默认值函数复制到我的查询中,而不是落到为列配置的默认值。我不喜欢它,但它可以在我的查询中减少重复完成工作。

   INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
      SELECT A,B,C,ISNULL(@prmSomeValue,suser_sname())
      FROM MyOtherTable

4 个答案:

答案 0 :(得分:3)

基本上这就是SQL Server正在做的事情,你可以做这样的事情,至少避免两个几乎相同的语句(伪代码):

INSERT (columnA,B,C) ... ;

IF @prmSomeValue IS NOT NULL
    UPDATE ... ;

我认为COALESCE没有办法使用默认值。

答案 1 :(得分:2)

我会说你的方法很好。简单检查后跟一个插入。如果您担心DRY,请封装呼叫,以便重复呼叫。

我想说db上的插入/更新在某些表上可能代价很高(取决于设计目标),所以如果你必须编写额外的代码来处理这个场景,那么我认为没有问题。 / p>

答案 2 :(得分:0)

这个可能有效,取决于你是指默认约束中定义的默认值,还是代码? 如果“约束”它失败,如果“代码”它的工作原理。 修改:您的意思是约束。卫生署!

SELECT A,B,C,@prmSomeValue
      FROM MyOtherTable
      WHERE @prmSomeValue IS NOT NULL
UNION ALL
SELECT A,B,C,DEFAULT
      FROM MyOtherTable
      WHERE @prmSomeValue IS NULL

您希望这样做,在INSERT子句中指定一列需要一个值。

所以你的第一个解决方案是你所做的......

答案 3 :(得分:0)

这样的事可能有用(不太漂亮):

INSERT INTO MyTable (fieldA,FieldB,FieldC,FieldD)  
SELECT A,B,C,
    case when @prmSomeValue is null 
then
        (SELECT text FROM syscomments WHERE id IN (SELECT cdefault FROM syscolumns
            WHERE id = object_id('MyTable') AND cdefault > 0))
    else @prmSomeValue
    end
FROM MyOtherTable