【问题标题】:TSQL Insert the column default value from Case StatementTSQL 从 Case 语句中插入列默认值
【发布时间】:2012-10-29 23:17:30
【问题描述】:

我想在存储过程插入中使用列的默认值,这样我就不必在多个地方重复默认值(它可能会改变... DRY 原则)。

T-SQL INSERT 操作有一个方便的“默认”关键字,我可以如下使用:

Declare @newA varchar(10)
Set @newA = 'Foo2'

-- I can use "default" like so...
Insert into Table_1 (
    A, 
    B) 
Values (
    @newA, 
    default)

但是,如果我需要做一些有条件的事情,我似乎无法让 case 语句返回“默认”。

-- How do I use 'default' in a case statement? 
INSERT INTO Table_1 (
    A,
    B )
VALUES (
    @newA,
    CASE WHEN (@newA <> 'Foo2') THEN 'bar' ELSE default END)
-- > yeilds "Incorrect syntax near the keyword 'default'."

可以插入默认值,然后根据需要进行更新,如下所示:

INSERT INTO Table_1 (
    A,
    B )
VALUES (
    @newA,
    default)
UPDATE Table_1 
SET B = CASE WHEN (A <> 'Foo2') THEN 'bar' ELSE B END
WHERE ID = SCOPE_IDENTITY()

但我真的很想有人告诉我“有更好的方法……”

如果有帮助,这里是此示例的表定义...

CREATE TABLE dbo.Table_1 (
    ID int NOT NULL IDENTITY (1, 1),
    A varchar(10) NULL,
    B varchar(10) NULL  )  
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT DF_Table_1_A DEFAULT 'A-Def' FOR A
GO
ALTER TABLE dbo.Table_1 ADD CONSTRAINT DF_Table_1_B DEFAULT 'B-Def' FOR B
GO

【问题讨论】:

    标签: sql sql-server tsql stored-procedures sql-server-2012


    【解决方案1】:

    default 只能在VALUES() 块内工作,这在CASE 语句中似乎不是可接受的值;您可以使用 if 语句来确定要插入的内容:

    DECLARE @newA varchar(10) = 'Foo2'
    
    IF (@newA <> 'Foo2')
    BEGIN
       INSERT INTO Table_1 (A, B)
       SELECT @newA, 'bar'
    END
    ELSE
    BEGIN
       --If you are using default values, you do not have to specify the column
       INSERT INTO Table_1 (A) 
       SELECT @newA
    END
    

    我认为这比插入后更新要好,这样您只需将正确的数据插入表中。它还将 INSERTS/UPDATES 的数量保持为 1。由于范围限定,在使用 @@IDENTITY 时也应该小心。考虑查看SCOPE_IDENTITY()

    【讨论】:

    • 所以基本上我得提前把它拆分出来……至少只有一个插入/更新而且我不必重复默认值……
    • 我对 SQL 团队很失望,因为 CASE 语句的 result_expression 不能指定 'default' 的等价物!或者可能是插入语句不适合语法。
    • @DanO 这似乎是一个限制 DEFAULT 只能在 VALUES() 中接受INSERT documentation
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2023-03-18
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多