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

标签 sql tsql sql-server-2008 insert column-defaults

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

相关文章:

mysql - SQL- 列出没有贡献的人

sql - 查询日程日期比较

java - 如何在Hibernate中运行mysql更新批量查询?

sql - 按顺序使用 asc 和 desc 变量

SQL - 安全地将 BIGINT 向下转换为 INT

sql - 如何使用 SQL Server 2008 基于表名搜索来查找存储过程的名称?

sql - 带分组的案例陈述

sql - 带有 CASE 语句的内部连接在 SQL SERVER 中不起作用

mysql - 基于第一个表合并多个表的数据

sql - 分组依据选择仅返回具有更新行的组