Ich habe diese innere XML, die ich an eine gespeicherte SQL Server-Prozedur übergeben.SQL Server-XML-Datei mit mehreren Knoten mit dem gleichen Namen
Wie Sie sehen können, enthält es mehr root
Knoten, sondern zusätzlich kann es auch 1 bis ‚n
‘ Anzahl von LotResults
geordneten Knoten enthalten.
Gibt es eine Möglichkeit, dies in der gespeicherten Prozedur zu manipulieren, so dass ich alle LotResults
/Result
Knoten für jeden Knoten root
abrufen kann?
Bisher habe ich die cursor
erklärt, die mit den Knoten der obersten Ebene umgehen können:
DECLARE cur CURSOR FOR
SELECT tab.col.value('ID[1]','NCHAR(10)') as INT_TransactionID,
tab.col.value('ResultDateTime[1]','INT') as DAT_ResultDateTime,
tab.col.value('StandardComment[1]/ID[1]','BIT') as INT_StandardCommentID,
tab.col.value('ReviewComment[1]/ID[1]','BIT') as INT_ReviewCommentID
FROM @XML_Results.nodes('/roots/root') AS tab(col)
OPEN cur
-- loop over nodes within xml document and populate declared variables
FETCH
NEXT
FROM cur
INTO @INT_TransactionID,
@DAT_ResultDateTime,
@INT_StandardCommentID,
@INT_ReviewCommentID
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN
-- use my values here
END
-- fetch next record
FETCH
NEXT
FROM cur
INTO @INT_TransactionID,
@DAT_ResultDateTime,
@INT_StandardCommentID,
@INT_ReviewCommentID
END
CLOSE cur;
Hinweis: ich einen Beitrag gefunden beschreibt how to extract nodes with the same name und ich fühle mich wie es ist etwas, das verwendet werden kann, was zu erreichen Ich möchte hier, aber ich brauche eine Anleitung, wie dies auf mein Szenario angewendet werden kann.
@Schnugo Dank um zurück zu kommen. Entschuldigung für den Druckbildschirm des XML, wird für zukünftige Beiträge bekannt sein. Was das Auslassen von Innercursor-Inhalten anbelangt, liegt das daran, dass ich zuerst übersortiert werden wollte. Im Grunde wird der Cursor über jeden Root-Knoten der obersten Ebene iterieren, alle relevanten Daten extrahieren und eine Anzahl von Tabellen "UPDATE". Haben Sie einen Hinweis, der in diesem Fall die Verwendung eines Cursors verhindern könnte? – Sandman
Ich rate dazu: Platziere ein 'INTO # myTempResult' direkt vor dem' FROM'. Dadurch wird das gesamte Ergebnis in eine neu erstellte Tabelle mit der entsprechenden automatisch erstellten Struktur verschoben. Danach benutze 'INSERT INTO MyTable (Spalte1, Spalte2, ...) SELECT DISTINCT Spalte1, Spalte2, ... FROM # myTempResult'. Sie benötigen eine Einfügung für jede Tabelle, in die Sie schreiben. Alles Set-basiert, kein Cursor ... – Shnugo
Danke für den Hinweis. Ich werde das ausprobieren und den gefürchteten Teufels-Cursor meiden;) – Sandman