更新具有变量值的行,如果变量为null,则使用default

时间:2013-05-31 13:37:14

标签: sql sql-server

假设我有一个变量:

declare @x int = /* smth here */

我有一个包含列的表格(例如ColX),该表格为not null且约束为default。现在我想以这样的方式更新表中的某些行:

update MyTable
set ColX = isnull(@x, default)
where blah-blah-blah

显然它无法执行,因为sql-server会显示错误,但我认为这个例子清楚地反映了我想要做的事情。 那么问题是如何做到这一点?
谢谢!

更新 所以我现在有这些方式:

  • 通过系统视图执行 - 获取column_default属性并使用动态查询执行
  • 在不同的子查询中执行这两种情况:

    if @x is null then update /* use default */ else update /* use @x */
    

    这种方式简单明了。也许对于那个会进一步阅读它的人来说,这是最透明的。另外请记住,还需要单独插入

    @x is null /* use default */ 
    

    @x is not null /* use @x */
    

  • 创建用户定义的函数:

    create function GetValueForColX(@value int) returns int
    as begin
        return isnull(@value, /* default value */)
    end
    

    然后默认使用它 - (GetValueForColX(null))和插入/更新查询GetValueForColX(@x)

2 个答案:

答案 0 :(得分:4)

系统表中显示的默认值仅适用于CLR过程。

如果您不想要2次单独更新,请在DEFAULT和更新中使用标量UDF。 因此,代替GETDATE(),将其包装在CREATE FUNCTION中,更改默认值并更新以使用它。

但是两个更新更简单......

答案 1 :(得分:3)

使用两次更新的可能解决方法

DECLARE @x int
IF @x IS NULL
  update MyTable
  set ColX = DEFAULT
ELSE 
  update MyTable
  set ColX = @x