यदि मौजूद नहीं है तो SQL सर्वर सम्मिलित करें




sql-server sql-server-2008 (6)

IF EXISTS से अलग SQL सर्वर के आपके संस्करण (2012?) के आधार पर आप मेर्ज का भी उपयोग कर सकते हैं:

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
    ( @_DE nvarchar(50)
    , @_ASSUNTO nvarchar(50)
    , @_DATA nvarchar(30))
AS BEGIN
    MERGE [dbo].[EmailsRecebidos] [Target]
    USING (VALUES (@_DE, @_ASSUNTO, @_DATA)) [Source]([De], [Assunto], [Data])
         ON [Target].[De] = [Source].[De] AND [Target].[Assunto] = [Source].[Assunto] AND [Target].[Data] = [Source].[Data]
     WHEN NOT MATCHED THEN
        INSERT ([De], [Assunto], [Data])
        VALUES ([Source].[De], [Source].[Assunto], [Source].[Data]);
END

मैं अपनी तालिका में डेटा डालना चाहता हूं, लेकिन केवल मेरे डीबी में मौजूद नहीं है!

मेरा कोड यहाँ है:

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   VALUES (@_DE, @_ASSUNTO, @_DATA)
   WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA);
END

और त्रुटि है:

संदेश 156, स्तर 15, राज्य 1, प्रक्रिया ईमेल RecebidosInsert, रेखा 11
कीवर्ड 'WHERE' के पास गलत वाक्यविन्यास।


आप जाओ कमांड का उपयोग कर सकते हैं। यह त्रुटि के बाद एसक्यूएल कथन के निष्पादन को पुनरारंभ करेगा। मेरे मामले में मेरे पास कुछ 1000 INSERT कथन हैं, जहां डेटाबेस में उन रिकॉर्ड्स का एक मुट्ठी भर पहले से मौजूद है, मैं बस नहीं जानता कि कौन से हैं। मैंने पाया कि कुछ 100 प्रोसेसिंग के बाद, निष्पादन सिर्फ एक त्रुटि संदेश के साथ बंद हो जाता है कि यह INSERT नहीं हो सकता क्योंकि रिकॉर्ड पहले से मौजूद है। काफी परेशान, लेकिन एक गो को हल करने के लिए इसे हल किया। यह सबसे तेज़ समाधान नहीं हो सकता है, लेकिन गति मेरी समस्या नहीं थी।

GO
INSERT INTO mytable (C1,C2,C3) VALUES(1,2,3)
GO
INSERT INTO mytable (C1,C2,C3) VALUES(4,5,6)
 etc ...

कोड नीचे आज़माएं

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   INSERT INTO EmailsRecebidos (De, Assunto, Data)
   select @_DE, @_ASSUNTO, @_DATA
   EXCEPT
   SELECT De, Assunto, Data from EmailsRecebidos
END

मैं एक विलय का उपयोग करता हूँ:

create PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   with data as (select @_DE as de, @_ASSUNTO as assunto, @_DATA as data)
   merge EmailsRecebidos t
   using data s
      on s.de = t.de
     and s.assunte = t.assunto
     and s.data = t.data
    when not matched by target
    then insert (de, assunto, data) values (s.de, s.assunto, s.data);
END

INSERT कमांड में WHERE क्लॉज नहीं है - आपको इसे इस तरह लिखना होगा:

ALTER PROCEDURE [dbo].[EmailsRecebidosInsert]
  (@_DE nvarchar(50),
   @_ASSUNTO nvarchar(50),
   @_DATA nvarchar(30) )
AS
BEGIN
   IF NOT EXISTS (SELECT * FROM EmailsRecebidos 
                   WHERE De = @_DE
                   AND Assunto = @_ASSUNTO
                   AND Data = @_DATA)
   BEGIN
       INSERT INTO EmailsRecebidos (De, Assunto, Data)
       VALUES (@_DE, @_ASSUNTO, @_DATA)
   END
END

सबसे तेज़ तरीके से ढूंढने वालों के लिए, मैं हाल ही में इन बेंचमार्कों में आया जहां स्पष्ट रूप से "इन्टरेट चयन ... चयन से बाहर ..." का उपयोग करके 50 मिलियन रिकॉर्ड या अधिक के लिए सबसे तेज़ साबित हुआ।

आलेख से कुछ नमूना कोड यहां दिया गया है (कोड का तीसरा ब्लॉक सबसे तेज़ था):

INSERT INTO #table1 (Id, guidd, TimeAdded, ExtraData)
SELECT Id, guidd, TimeAdded, ExtraData
FROM #table2
WHERE NOT EXISTS (Select Id, guidd From #table1 WHERE #table1.id = #table2.id)
-----------------------------------
MERGE #table1 as [Target]
USING  (select Id, guidd, TimeAdded, ExtraData from #table2) as [Source]
(id, guidd, TimeAdded, ExtraData)
    on [Target].id =[Source].id
WHEN NOT MATCHED THEN
    INSERT (id, guidd, TimeAdded, ExtraData)
    VALUES ([Source].id, [Source].guidd, [Source].TimeAdded, [Source].ExtraData);
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT id, guidd, TimeAdded, ExtraData from #table2
EXCEPT
SELECT id, guidd, TimeAdded, ExtraData from #table1
------------------------------
INSERT INTO #table1 (id, guidd, TimeAdded, ExtraData)
SELECT #table2.id, #table2.guidd, #table2.TimeAdded, #table2.ExtraData
FROM #table2
LEFT JOIN #table1 on #table1.id = #table2.id
WHERE #table1.id is null




stored-procedures