sql - TSQL 从 Case 语句中插入列默认值

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

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

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

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

最佳答案

default 只能在 VALUES() block 中工作,这在 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 - TSQL 从 Case 语句中插入列默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13131046/

相关文章:

java.sql.SQLException : Io exception: Size Data Unit (SDU) mismatch

每次运行 SQL 查询时,SQL 检查前 100 行是否不同?

SQL Where 子句排除了超出应有的范围

sql - 如何通过 MS SQL Server 删除目录上的文件

sql - 如何在sql脚本中从另一个sql server服务器表中选择数据?

sql - LIKE '[A-D]%' 有什么区别?和介于 'A' 和 'D' 之间;在 SQL Server 中

mysql - 如何正确地将 sql 数据导出到 .csv

mysql - TSQL 选择不同的

tsql - Node.js SQL Server 扩展在连接池方面如何比较?

sql - MS SQL Server,多次插入