2016-04-19 10 views
2

Ich bin neu in XML (in SQL) und wurde gebeten, eine Stored Procedure zu erstellen, die eine XML-Zeichenfolge an ein Feld auf einem anderen Server übergibt. Ich bin in der Lage, die XML-Zeichenfolge mit dem FOR XML-RAW zu erhalten, aber ich bekomme 1 Zeile mit allen Datensätzen und kann nicht nur die einzelnen Zeilen Daten zurückgeben. Ich muss Ergebnis 100 Zeilen haben, wenn meine Abfrage 100 Zeilen hat, jetzt bekomme ich 1 Zeile mit allen Datensätzen. Wie kann ich die XML-Zeichenfolge nur die Zeilendaten und nicht die gesamte Zeichenfolge für alle Zeilen enthalten?Verwenden von FOR XML zum Übergeben der XML-Zeichenfolge als Wert

SELECT indv_hrn as 'MRN' 
FROM Members_rawdata mr (nolock) 
inner join Members m (nolock)on mr.memberrecid = m.MemberRecID 
inner join Importfile i (nolock)on m.importfileid = i.importfileid 
WHERE m.importFileID = 83598 and m.Barcode is not null 
FOR XML RAW ('INDEX'),ELEMENTS 
+1

Es ist besser 'FOR XML PATH zu verwenden()', die Ihnen viel mehr Kontrolle über die Erstellung Ihrer XML bietet. Und bitte stellen Sie einige Beispieldaten in einer kleinen Beispieltabelle und der erwarteten Ausgabe zur Verfügung, thx – Shnugo

+0

Hi JMunoz! Da bist du neu hier: Willkommen! Ist diese Frage noch offen? Brauchen Sie weitere Hilfe? Wenn diese Frage gelöst ist, wäre es sehr nett von Ihnen, die Annahmeprüfung unter dem Stimmzähler auf die Antwort anzukreuzen, die Sie für die beste halten. Und zu meiner eigenen Sorge: Bitte seien Sie sich der Tatsache bewusst, dass die meisten Fachleute, die Antworten auf SO geben, nach Reputationspunkten hungern. [Bitte lesen Sie: jemand-Antworten] (http://stackoverflow.com/help/someone-answers). – Shnugo

Antwort

1

FOR XML generiert ein XML-Dokument pro Ergebnismenge. Unterabfragen können verwendet werden, für jede Zeile separate XML-Dokumente zu generieren:

SELECT (SELECT indv_hrn AS MRN FOR XML PATH ('INDEX'), TYPE) AS [XML] 
FROM Members_rawdata mr (NOLOCK) 
INNER JOIN Members m (NOLOCK) ON mr.memberrecid = m.MemberRecID 
INNER JOIN Importfile i (NOLOCK) ON m.importfileid = i.importfileid 
WHERE m.importFileID = 83598 AND m.Barcode IS NOT NULL 
+0

Diese Antwort ist - uhm - 10 Jahre zu spät :-) Es ist absolut nicht notwendig, XML durch String-Verkettung zu generieren. T-SQL bietet wirklich großartige Unterstützung, um XML sauber und einfach zu erstellen, mit Namespaces, impliziten Kodierungen von verbotenen Zeichen, Datumsformat und all dem Zeug ... – Shnugo

+0

Ich habe deine Antwort bis zum Ende gelesen und das macht es noch schlimmer ... Sie zeigen, dass Sie wissen, wie man es macht und trotzdem schlagen Sie die falsche und gefährliche Herangehensweise vor. Ihr Code könnte funktionieren. Es wird in einer produktiven Umgebung implementiert werden. Und eine Weile später gibt es das erste 'indv_hrn' mit verbotenem Charakter. Sie wissen nicht einmal, welcher Datentyp diese Spalte ist ... – Shnugo

+1

@Shnugo OK. Punkt genommen. –

2

Diese Antwort einen Ansatz zeigt zeilenweise XML aus Tabellenzeilen zu erhalten:

DECLARE @tbl TABLE(col1 INT, col2 DATETIME, col3 VARCHAR(100)); 
INSERT INTO @tbl VALUES 
(1,GETDATE(),'test easy') 
,(1,{ts'2016-01-01 23:59:00'},'test with <&> some evil '); 

SELECT (SELECT col1,col2,col3 FOR XML PATH('rowData'),TYPE) 
FROM @tbl 

Das Ergebnis

<rowData><col1>1</col1><col2>2016-04-21T15:35:24.460</col2><col3>test easy</col3></rowData> 
<rowData><col1>1</col1><col2>2016-01-01T23:59:00</col2><col3>test with &lt;&amp;&gt; some evil </col3></rowData> 

BTW: Sie verwenden NOLOCK überall. Wenn Sie nicht wissen, wirklich gut!, was hier vor sich geht, könnte man diese und die beiliegenden Links lesen: NOLOCK HINTS IN REPORT Stored Procedures