我在将行插入表中的存储过程中有类似于以下的代码,我想将最后一列 (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。
关于sql - 有没有办法在 INSERT..SELECT 语句中有条件地使用默认列值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2366580/