Abfragen einer XML-list im SQL-server mit Xquery

Ich habe eine Tabelle in SQL-server, der verwendet wird, um eingereichte Formulardaten zu speichern. Die Formularfelder für jede Einreichung sind dynamisch, so dass die gesammelten data als Namenswertpaare in einer XML-dataspalte mit dem Namen [formdata] wie im folgenden Beispiel gespeichert sind …

Dies funktioniert gut für das Sammeln der erforderlichen Informationen, aber ich muss jetzt diese data zu einer flachen file oder ein Excel-Dokument für die Verarbeitung von menschlichen Mitarbeitern zu machen und ich frage mich, was der beste path, dies zu tun wäre mit Xquery, so dass die data lesbar ist ?

Der Tisch ist wie folgt …

[id], [user_id], [datestamp], [formdata] 

Und ein Beispielwert für Formdaten

 <formfields> <item> <itemKey>USER_NAME</itemKey> <itemValue>test</itemValue> </item> <item> <itemKey>value2</itemKey> <itemValue>test</itemValue> </item> <item> <itemKey>MYID</itemKey> <itemValue>5468512</itemValue> </item> <item> <itemKey>testcheckbox</itemKey> <itemValue>item1,item3</itemValue> </item> <item> <itemKey>samplevalue</itemKey> <itemValue>item3</itemValue> </item> <item> <itemKey>accept_terms</itemKey> <itemValue>True</itemValue> </item> </formfields> 

Ist das was du willst?

 select id, [user_id], datestamp, fivalue('itemKey[1]', 'varchar(50)') as itemKey, fivalue('itemValue[1]', 'varchar(50)') as itemValue from YourTable as T cross apply T.formdata.nodes('/formfields/item') as f(i) 

Test:

 declare @T table ( id int, user_id int, datestamp datetime, formdata xml ) insert into @T (id, user_id, datestamp, formdata) values (1, 1, getdate(), '<formfields> <item> <itemKey>USER_NAME</itemKey> <itemValue>test</itemValue> </item> <item> <itemKey>value2</itemKey> <itemValue>test</itemValue> </item> <item> <itemKey>MYID</itemKey> <itemValue>5468512</itemValue> </item> <item> <itemKey>testcheckbox</itemKey> <itemValue>item1,item3</itemValue> </item> <item> <itemKey>samplevalue</itemKey> <itemValue>item3</itemValue> </item> <item> <itemKey>accept_terms</itemKey> <itemValue>True</itemValue> </item> </formfields> ' ) select id, [user_id], datestamp, fivalue('itemKey[1]', 'varchar(50)') as itemKey, fivalue('itemValue[1]', 'varchar(50)') as itemValue from @T as T cross apply T.formdata.nodes('/formfields/item') as f(i) 

Ergebnis:

 id user_id datestamp itemKey itemValue 1 1 2011-05-23 15:38:55.673 USER_NAME test 1 1 2011-05-23 15:38:55.673 value2 test 1 1 2011-05-23 15:38:55.673 MYID 5468512 1 1 2011-05-23 15:38:55.673 testcheckbox item1,item3 1 1 2011-05-23 15:38:55.673 samplevalue item3 1 1 2011-05-23 15:38:55.673 accept_terms True