Dan*_*anO 6 sql t-sql sql-server 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)
Run Code Online (Sandbox Code Playgroud)
但是,如果我需要做一些有条件的事情,我似乎无法让 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'."
Run Code Online (Sandbox Code Playgroud)
我可以插入默认值,然后根据需要进行更新,如下所示:
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()
Run Code Online (Sandbox Code Playgroud)
但我真的希望有人告诉我“有更好的方法......”
这是此示例的表定义(如果有帮助的话)...
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
我认为这比插入后更新更好,这样您只将正确的数据插入表中。它还将 INSERTS/UPDATES 的数量保持为 1。由于作用域的原因,您在使用 @@IDENTITY 时也应该小心。考虑研究SCOPE_IDENTITY()。
| 归档时间: |
|
| 查看次数: |
5179 次 |
| 最近记录: |