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

Joh*_*nFx 6 sql t-sql insert sql-server-2008 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
Run Code Online (Sandbox Code Playgroud)

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

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

有人有主意吗?

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

...DEFAULT (suser_sname()) FOR [FieldD]
Run Code Online (Sandbox Code Playgroud)

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

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

Aar*_*and 3

由于本质上这就是 SQL Server 正在做的事情,因此您可以执行类似的操作来至少避免两个几乎相同的语句(伪代码):

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

IF @prmSomeValue IS NOT NULL
    UPDATE ... ;
Run Code Online (Sandbox Code Playgroud)

我认为没有办法与默认值合并。

  • Zyphrax,我不同意 ISNULL()。我总是使用 COALESCE() ,因为如果我突然需要额外的参数,我不必更改我的代码。反对 ISNULL() 的另外两点是:它不是 ANSI 标准,并且与其他语言(VB、Access)中的相同 ISNULL() 函数的行为不同,因此可能会让来自这些地方的用户感到困惑。 (2认同)