如果变量为空,则使用默认值更新行的值

7

假设我有一个变量:

declare @x int = /* smth here */

我有一张表,其中一列(例如ColX)是not null并具有default约束。现在我想以以下方式更新表中的某些行:

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

显然,由于 SQL Server 会显示错误,因此无法执行此操作。但我认为这个例子清楚地反映了我的意图。 那么问题是如何实现呢?
谢谢! 更新 现在我有以下几种方式:
  • do it through system views - get column_default propery and use dynamic query execution
  • perform both cases in separate subqueries:

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

    This way is a straightforward and the simpliest. Maybe even the most transparent for the other guy who'll read it further. Also keep in mind it will require also to have separate inserts for both

    @x is null /* use default */ 
    

    and

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

    cases

  • create user-defined function:

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

    And then use it in default - (GetValueForColX(null)) and in insert/update query GetValueForColX(@x)


@danihp,啊,我只是希望有更简单的方法来做这件事 :) 谢谢。如果在不久的将来没有更简单的方法,我会关闭问题。 - pkuderov
@danihp,好的。假设我有默认值=0。在INFORMATION_SCHEMA.COLUMNS.COLUMN_DEFAULT中,这个列有一个((0))。哪种方法最好从中检索默认值? - pkuderov
不要关闭这个问题,这是一个好问题。我也在等待其他人的答案(我删除了我的第一条评论,以增加对你的问题的兴趣 ;)) - dani herrera
2个回答

4

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

如果您不想进行两个单独的更新,请在DEFAULT和更新中使用标量UDF。因此,不要使用例如GETDATE(),而是将其包装在CREATE FUNCTION中,更改默认值并更新以使用此函数。

但是,两次更新更简单...


不错的想法。我刚试了一下,是的,它有效。但我不能否认两个更新可能更清晰、更简单。 - pkuderov
但这意味着在此情况下我需要执行2个插入操作(一个是非空值,一个是默认值)。所以现在我不确定 :) - pkuderov
@pkuderov:两种方式都可以。都能正常工作。我的想法可能稍微难以维护(比如你将GETDATE()更改为GETUTCDATE(),虽然不太可能),而复制调用则容易出现拼写错误,如果需要更改,则可能会更容易。就个人而言,我会使用我的方法来避免出现拼写错误的潜在问题:默认值很少更改。 - gbn

3

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接