2016-05-03 4 views
0

Ich muss Daten in meine Tabelle aus XML einfügen. Ich muss vor dem Einfügen der Daten auf Eindeutigkeit prüfen.Wie Sie überprüfen, ob ein Element bereits in der Tabelle vorhanden ist, wenn Sie aus einem XML-Code einfügen

Mein aktueller Code ist dies:

@declare @existing_id INT=0 

DELETE FROM [maintenance.master].[oper_cat] 
WHERE [oper_cat_id] IN (SELECT tab.col.value('Id[1]','int') 
         FROM @oper_cat.nodes('//Sample') AS tab(col) 
         WHERE CAST(tab.col.value('Deleted[1]','bit') AS BIT) = 1) 

;WITH Sample AS 
( 
    SELECT 
     tab.col.value('Id[1]','int') AS [Id], 
     tab.col.value('Title[1]','nvarchar(100)') AS [Title], 
     tab.col.value('Type[1]','char(1)') AS [Type], 
    FROM 
     @oper_cat.nodes('//Sample') AS tab(col) 
    WHERE 
     CAST(tab.col.value('Deleted[1]','bit') AS BIT) = 0 
) 
SET @existing_id = (SELECT id 
        FROM sample_table 
        WHERE title = Sample.Title AND type = Sample.Type) 

IF @existing_id = 0 
BEGIN 
    INSERT INTO sample_table(id, title, type) 
    VALUES(Sample.Id, Sample.Title, Sample.Type) 
END 

Offensichtlich ist der obige Code funktioniert nicht. Ich erhalte einen Fehler, wenn ich versuche, die vorhandene ID zu erhalten. Wie kann ich dies überprüfen, bevor Sie den Wert in die Tabelle einfügen? Ich bin nicht sehr gut mit SQL jede Hilfe würde sehr geschätzt werden.

+0

Erste XML-Daten an einen table_variable einfügen oder temp_table und MERGE diese mit Ihrem tatsächlichen Tisch. –

Antwort

1

Probieren Sie es wie folgt aus:

--a volatile table to get your XML row-wise 
DECLARE @tmpTable TABLE(Id INT, Deleted BIT,Title VARCHAR(150),[Type] CHAR(1)); 
INSERT INTO @tmpTable 
SELECT tab.col.value('Id[1]','int') AS [Id], 
     tab.col.value('Deleted[1]','bit') AS Deleted, 
     tab.col.value('Title[1]','nvarchar(100)') AS [Title], 
     tab.col.value('Type[1]','char(1)') AS [Type] 
FROM 
    @oper_cat.nodes('//Sample') AS tab(col); 

--Delete all with Deleted=1 
DELETE FROM [maintenance.master].[oper_cat] 
WHERE [oper_cat_id] IN (SELECT Id FROM @tmpTable WHERE Deleted=1); 

--Insert all with Deleted=0 
INSERT INTO sample_table(id, title, type) 
SELECT Id,Title,[Type] 
FROM @tmpTable 
WHERE Deleted=0; 
Verwandte Themen