有没有办法在INSERT..SELECT声明有条件使用缺省列值?
-
23-09-2019 - |
题
我有类似下面的代码在存储过程中插入行到一个表,我想最后一列(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
不隶属于 StackOverflow