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.

image

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 “@”.