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

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
有帮助吗?

解决方案

由于本质上这是SQL Server正在做什么,你可以做这样的事情,至少避免出现两个几乎相同的语句(伪代码):

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

IF @prmSomeValue IS NOT NULL
    UPDATE ... ;

我不认为有一种方法可以使用默认值COALESCE。

其他提示

我会说你的方法是好的。一个简单的检查,然后一个刀片。如果你担心干燥,封装调用,以便它可以反复调用。

我要说的是,插入/上一个数据库更新可能是昂贵的一些表(依赖于设计目标),所以如果你必须编写额外的代码来处理这种情况,然后我看到权衡没有问题。

此的力量的工作,取决于你的意思的代码在默认约束定义的默认值,或上? 如果“约束”失败,如果“代码”它的工作原理。 修改:你的意思是约束。 DOH!

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子句中指定列需要一个值。

所以你的第一个解决办法是什么你做...

像这样的东西可能会奏效(THO不是很漂亮):

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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top