2016-07-26 9 views
2

Würde mir jemand helfen können, versuche ich eine XML-Datei in eine SQL-Server-Tabelle zu importieren. Ich kann die erforderlichen Daten importieren, habe aber Schwierigkeiten, sie in dem erforderlichen Format zu erhalten.XML in SQL-Tabelle importieren und Daten formatieren

declare @input XML = '<Sub> 
    <Results> 
    <Result> 
     <ids> 
     <id> 
      <type>code</type> 
      <value>9004a3d2</value> 
     </id> 
     <id> 
      <type>username</type> 
      <value>jbloggs001</value> 
      <date>20160725</date> 
     </id> 
     <id> 
     <type>EmployeeID</type> 
     <value></value> 
     <date>20160725</date> 
     </id> 
    </ids> 
    </Result> 
</Results> 
</Sub>' 
    SELECT 
    datatype = XCol.value('(type)[1]','varchar(25)'), 
    datavalue = XCol.value('(value)[1]','varchar(50)') 
    FROM 
     @input.nodes('/Sub/Results/Result/ids/id') AS XTbl(XCol) 

Dies gibt 3 Spalten wie:

datatype  datavalue 
-------------------------------- 
    code  9004a3d2 
    username jbloggs001 
    employeeID

Wäre es möglich, es zu erhalten, wie zu importieren?

EmployeeID USername  Code 
    --------------------------------- 
jbloggs 0019004a3d2 

Dank

+2

Sie müssen zu benutze PIVOT - check out: https://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx –

Antwort

2

Wie in den Kommentaren vorgeschlagen, die mit PIVOT getan werden könnte:

SELECT * 
    FROM (
    SELECT 
    datatype = XCol.value('(type)[1]','varchar(25)'), 
    datavalue = XCol.value('(value)[1]','varchar(50)') 
    FROM 
     @input.nodes('/Sub/Results/Result/ids/id') AS XTbl(XCol) 
    ) as p 
    PIVOT (
     MAX(datavalue) FOR datatype IN (EmployeeID,username,code) 
    ) as pvt 

Ausgang:

EmployeeID username code 
jbloggs001 9004a3d2 

Wenn der Eingang immer mit dem gleichen type s ist:

SELECT XCol.value('(id/value)[3]','varchar(50)') as EmployeeID, 
     XCol.value('(id/value)[2]','varchar(50)') as username, 
     XCol.value('(id/value)[1]','varchar(50)') as code 
FROM @input.nodes('/Sub/Results/Result/ids') AS XTbl(XCol) 
+0

Die 'PIVOT' Lösung ist fi ne (+1 von meiner Seite), aber ich würde mich nicht auf die Sortierreihenfolge im XML verlassen. Ein Grund für die Verwendung von XML ist die Erweiterbarkeit ohne bestehende Lösungen zu unterbrechen. Es war viel sicherer, die Knoten mit einem geeigneten XQuery zu erhalten (siehe meine Antwort ...) – Shnugo

1

Unten Abfrage für Ihre Lösung funktioniert

Select [EmployeeID],[Username],[Code] 
FROM #TEMP 
PIVOT 
(
MAX(DATAVALUE) FOR DATATYPE IN (code,username,employeeID) 
)A 
1

Eine weitere Option ist, enthält XQuery-Funktion

declare @input XML = '<Sub> 
    <Results> 
    <Result> 
     <ids> 
     <id> 
      <type>code</type> 
      <value>9004a3d2</value> 
     </id> 
     <id> 
      <type>username</type> 
      <value>jbloggs001</value> 
      <date>20160725</date> 
     </id> 
     <id> 
     <type>EmployeeID</type> 
     <value></value> 
     <date>20160725</date> 
     </id> 
    </ids> 
    </Result> 
</Results> 
</Sub>'; 
    SELECT 
    code = XCol.value('(id[contains((./type)[1],"code")]/value)[1]','varchar(50)'), 
    username = XCol.value('(id[contains((./type)[1],"username")]/value)[1]','varchar(50)'), 
    EmployeeID = XCol.value('(id[contains((./type)[1],"EmployeeID")]/value)[1]','varchar(50)') 

    FROM 
     @input.nodes('/Sub/Results/Result/ids') AS XTbl(XCol); 
0

Ein weiterer sehr gerade und typsichere Ansatz war:

SELECT id.value('(id[type="code"]/value)[1]','varchar(max)') AS code 
     ,id.value('(id[type="username"]/value)[1]','varchar(max)') AS username 
     ,id.value('(id[type="EmployeeID"]/value)[1]','varchar(max)') AS EmployeeID 
FROM @input.nodes('Sub/Results/Result/ids') AS A(id) 
Verwandte Themen