|
我想知道记录是否只能插入表中而不包含记录?
$ B1 v: ?, O: _1 `. _/ J0 k( u/ h是否有一个查询可以做到这一点,还是我需要一个存储过程?
8 n$ }( M, B D- b8 U- |6 |0 {5 \
& n% {: _! r% H; q. d 解决方案: / _! d1 R* o4 A& X
你没说什么版本SQL Server。如果使用SQL Server
2 K$ C6 m' K e/ B+ O6 P2008,则可以使用MERGE7 [7 m, }; t0 R4 G+ R$ c' r; E5 ^/ E
注:合并通常用于注:Upsert,这是我最初认为的问题,但没有WHEN MATCHED子句且仅带WHEN NOTMATCHED在这种情况下,句子是有效的。用法示例。* h6 {. J$ X- V' w. Y
CREATE TABLE #A( [id] [int] NOT NULL PRIMARY KEY CLUSTERED,[C] [varchar](200) NOT NULL) MERGE #A AS target USING (SELECT 3,'C') AS source (id,C) ON (target.id = source.id) /*Uncomment for Upsert Semantics WHEN MATCHED THEN UPDATE SET C = source.C */ WHEN NOT MATCHED THEN INSERT (id,C) VALUES (source.id,source.C);就执行成本而言,当需要执行插入操作时,两者看起来大致相等…
# d H& G" }+ H I链接到计划图像进行第一次操作
# F) y- E$ Z7 k9 ]但在第二轮比赛中,马修的答案似乎更便宜,没有插入。我不确定是否有改进的方法。$ C+ K/ n/ o5 P! g6 F, r# }
链接到计划图像以进行第二次运行8 ?7 y1 O1 x0 X [0 Z* o
测试脚本- i) H% A8 K4 I, h, p3 @) o
select * into #testtablefrom master.dbo.spt_valuesCREATE UNIQUE CLUSTERED INDEX [ix] ON #testtable([type] ASC,[number] ASC,[name] ASC)declare @name nvarchar(35)= 'zzz'declare @number int = 50declare @type nchar(3) = 'A'declare @low intdeclare @high intdeclare @status int = 0;MERGE #testtable AS targetUSING (SELECT @name,@number,@type,@low,@high,@status) AS source (name,number,[type],low,high,[status])ON (target.[type] = source.[type] AND target.[number] = source.[number] and target.[name] = source.[name] )WHEN NOT MATCHED THEN INSERT (name,number,[type],low,high,[status])VALUES (source.name,source.number,source.[type],source.low,source.high,source.[status]);set @name = 'yyy'IF NOT EXISTS (SELECT * FROM #testtable WHERE [type] = @type AND [number] = @number and name = @name) BEGININSERT INTO #testtable(name,number,[type],low,high,[status])VALUES (@name,@number,@type,@low,@high,@status);END |
|