代码之家  ›  专栏  ›  技术社区  ›  JohnFx

有没有在insert..select语句中有条件地使用默认列值的方法?

  •  6
  • JohnFx  · 技术社区  · 14 年前

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

    这是可行的,但违反了干燥原则。我正在尝试用一个insert语句来实现这一点。沿着下面的伪代码行的一些东西。

       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
    
    4 回复  |  直到 13 年前
        1
  •  3
  •   Aaron Bertrand    14 年前

    因为本质上这就是SQL Server所做的,所以您可以这样做,以至少避免两个几乎相同的语句(伪代码):

    INSERT (columnA,B,C) ... ;
    
    IF @prmSomeValue IS NOT NULL
        UPDATE ... ;
    

    我认为没有一种方法可以与默认值合并。

        2
  •  2
  •   Preet Sangha    14 年前

    我想说你的方法很好。简单的检查,然后插入一个。如果您担心干燥,请封装该调用,以便重复调用。

    我会说,DB上的插入/更新在某些表上可能会很昂贵(取决于设计目标),所以如果您必须编写额外的代码来处理这个场景,那么我认为权衡没有问题。

        3
  •  0
  •   gbn    14 年前

    这个 可以 工作,取决于您是指在默认约束中定义的默认值,还是在代码中定义的默认值? 如果“约束”失败,如果“编码”成功。 编辑 :你的意思是约束。呸!

    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子句中指定一列都需要一个值。

    所以你的第一个解决方案就是你所做的……

        4
  •  0
  •   pjacko    14 年前

    像这样的东西可能有用(但不是很漂亮):

    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