आप SQL सर्वर का संस्करण नहीं कहें। एसक्यूएल सर्वर 2008 आप MERGE
नायब उपयोग कर सकते हैं: यह एक Upsert के लिए मर्ज है जो मैं मूल रूप से सोचा था कि सवाल पूछ रहा था उपयोग करने के लिए हमेशा की तरह है, लेकिन यह WHEN MATCHED
खंड के बिना और सिर्फ एक WHEN NOT MATCHED
खंड इतना काम करता है के साथ मान्य है इस मामले के लिए भी। उदाहरण उपयोग
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);
निष्पादन के संदर्भ में लागत दो लगभग बराबर एक सम्मिलित किया जा रहा है जब देखो ...
Link to plan images for first run
लेकिन इसके दूसरे भाग जब वहाँ मैथ्यू के लिए किया जाना नहीं डालने है पर जवाब कम लागत दिखता है। मुझे यकीन नहीं है कि इसमें सुधार करने का कोई तरीका है या नहीं।
Link to plan images for second run
टेस्ट स्क्रिप्ट
select *
into #testtable
from master.dbo.spt_values
CREATE UNIQUE CLUSTERED INDEX [ix] ON #testtable([type] ASC,[number] ASC,[name] ASC)
declare @name nvarchar(35)= 'zzz'
declare @number int = 50
declare @type nchar(3) = 'A'
declare @low int
declare @high int
declare @status int = 0;
MERGE #testtable AS target
USING (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)
BEGIN
INSERT INTO #testtable
(name, number, [type], low, high, [status])
VALUES (@name, @number, @type, @low, @high, @status);
END
क्या आपने एक विशिष्टता बाधा जोड़ने पर विचार किया है? – bmm6o