XML Nodes W poprzednim wpisie pokazałem jak odczytać plik XML przy użyciu OPENXML. Według dokumentacji jest to najbardziej wydajny sposób na odczytywanie dużych naprawdę dużych plików XML. Jednak alternatywa istnieje i ma ona nazwę XMLNodes.
Podane poniższe operacje można wykonać tylko na parametrze typu XML w poprzednim przykładzie użyłem parametru VARCHAR.
Oto prosty przykład odczytu XML, jak i zapisu jego zawartości do tabeli. Kiedyś pewien kolega zasugerował mi to jako jeden ze sposób do umieszczania listy danych na raz w procedurze n.p do insertów. Dzisiaj szczerze zastanawiałbym się nad inny rozwiązaniem ,ale ten sposób nie jest też do końca taki zły.
CREATE TABLE #People
(
ID INT NOT NULL primary key,
Name VARCHAR(2048) NOT NULL,
Age INT NOT NULL,
Number INT NOT NULL
)
DECLARE @PeopleXml XML
SET @PeopleXml = '<People>
<Person Number="4000">
<id>5</id>
<Name>Cezary</Name>
<Age>28</Age>
</Person>
<Person Number="40">
<id>6</id>
<Name>Damian</Name>
<Age>24</Age>
</Person>
</People>'
---- put [1] at the end to ensure the path expression returns a singleton.
INSERT INTO #People (ID,Name,Age,Number)
SELECT
Pers.value('(id)[1]', 'int') AS 'ID',
Pers.value('(Name)[1]', 'Varchar(50)') AS 'Name',
Pers.value('(Age)[1]', 'varchar(50)') AS'LastName',
Pers.value('@Number[1]', 'varchar(50)') AS 'Number'
FROM
@PeopleXml.nodes('/People/Person') AS EMP(Pers)
SELECT * FROM #People
DROP TABLE #People
Oto wynik zapytania dowodzący ,że insert to tabeli wykonał się poprawnie.
W tym przykładzie trzeba tylko zapamiętać składnie zapytania. Dla pewności warto dodawać [1] po nazwie elementu aby mieć pewność ,że zostanie zawsze zwrócony singleton. Tak jak poprzednim przykładzie, jeśli chcemy odnieść do atrybutu danej gałęzi przed nazwą elementu dodajemy symbol “@”.