我在一个存储过程中有一个类似于以下代码,在表中插入一行,我想将最后一列(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
答案 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