/* Podstawy XML */

<?xml version="1.0"?>

<?xml version="1.0" encoding="UTF-8"?>

<?xml version="1.0" encoding="UTF-8"?>
<root>
</root>

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Order />
</root>

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Order  CustomerID="ALFKI"  OrderID="10634" OrderDate="1997-08-25T00:00:00" />
</root>

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Order  CustomerID="ALFKI"  OrderID="10634" OrderDate="1997-08-25T00:00:00" />
   <Order  CustomerID="ALFKI"  OrderID="10692" OrderDate="1997-10-03T00:00:00" />
   <Order  CustomerID="ALFKI"  OrderID="10702" OrderDate="1997-10-13T00:00:00" />
   <Order  CustomerID="ALFKI"  OrderID="10835" OrderDate="1998-01-15T00:00:00" />
</root>

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">
      <Order  OrderID="10634" OrderDate="1997-08-25T00:00:00" />
      <Order  OrderID="10692" OrderDate="1997-10-03T00:00:00" />
      <Order  OrderID="10702" OrderDate="1997-10-13T00:00:00" />
      <Order  OrderID="10835" OrderDate="1998-01-15T00:00:00" />
   </Customer>
</root>

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">
      <Order  OrderID="10634" OrderDate="1997-08-25T00:00:00" />
      <Order  OrderID="10692" OrderDate="1997-10-03T00:00:00" />
      <Order  OrderID="10702" OrderDate="1997-10-13T00:00:00" />
      <Order  OrderID="10835" OrderDate="1998-01-15T00:00:00" />
   </Customer>
   <Customer CustomerID="ANTON" CompanyName="Antonio Moreno Taqueria">
      <Order  OrderID="10365" OrderDate="1996-11-27T00:00:00" />
      <Order  OrderID="10507" OrderDate="1997-04-15T00:00:00" />
      <Order  OrderID="10535" OrderDate="1997-05-13T00:00:00" />
      <Order  OrderID="10573" OrderDate="1997-05-19T00:00:00" />
   </Customer>
</root>

/* Przestrze nazw */

<?xml version="1.0" encoding="UTF-8"?>
<Schema xmlns="urn:schemas-microsoft-com:xml:data"
           xmlns:dt="urn:schemas-microsoft-com:xml:datatypes"
           xmlns:sql=" urn:schemas-microsoft-com:xml:xml-sql"
           sql:xsl='../Customers.xsl'>
 <ElementType name="Root" content="empty"   />
 <ElementType name="Customers" sql:relation="Customers">
      <AttributeType name="CustomerID"/>
      <AttributeType name="CompanyName"/>
      <AttributeType name="Address"/>
      <AttributeType name="City"/>
      <AttributeType name="Region"/>
      <AttributeType name="PostalCode"/>
      <attribute type="CustomerID" sql:field="CustomerID"/>
      <attribute type="CompanyName" sql:field="CompanyName"/>
      <attribute type="Address" sql:field="Address"/>
      <attribute type="City" sql:field="City"/>
      <attribute type="Region" sql:field="Region"/>
      <attribute type="PostalCod" sql:field="PostalCod"/>
 </ElementType>
</Schema>

/* Zawarto elementw */

<?xml version="1.0" encoding="UTF-8"?>
<root>
   <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">
      <Note Date="1997-08-25T00:00:00">
      Klient dzwoni dzisiaj i zoy nowe zamwienie. Mwi, e bardzo jest zadowolony ze wsppracy z nami i chciaby j bardziej zacieni.
      </Note>
      <Note Date="1997-08-26T00:00:00">
      Klient powrci do tematu zacienienia wsppracy. Zaproponowa zwikszenie obrotu o 50000 z miesicznie.
      </Note>
   </Customer>
</root>

/* ROW */

USE Northwind

SELECT Customers.CustomerID,
   Customers.CompanyName,
   Orders.OrderID,
   Orders.OrderDate
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'


USE Northwind

SELECT Customers.CustomerID,
   Customers.CompanyName,
   Orders.OrderID,
   Orders.OrderDate
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
FOR XML RAW

/* AUTO */

USE Northwind

SELECT Customers.CustomerID,
   Customers.CompanyName,
   Orders.OrderID,
   Orders.OrderDate
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
FOR XML AUTO

/* Nazwy kolumn */

USE Northwind

SELECT 1                     as Tag,
   NULL                      as Parent,
   Customers.CustomerID   as [Customer!1!CustomerID], 
   Customers.CompanyName     as [Customer!1!CompanyName],
      NULL                   as [Order!2!OrderID],
      NULL                   as [Order!2!OrderDate]
FROM Customers
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'

UNION ALL

SELECT 2,
   1,
   Customers.CustomerID,
   Customers.CompanyName,
   Orders.OrderID,
   Orders.OrderDate
FROM Customers
JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
ORDER BY [Customer!1!CustomerID], [Order!2!OrderID]
FOR XML EXPLICIT


USE Northwind

SELECT 1                     as Tag,
   NULL                      as Parent,
   Customers.CustomerID   as [Customer!1!CustomerID],
   Customers.CompanyName     as [Customer!1!CompanyName],
      NULL                   as [Order!2!OrderID],
      NULL                   as [Order!2!OrderDate],
   NULL                   as [Order!2!CompanyName]
FROM Customers
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'

UNION ALL

SELECT 2,
      1,
      Customers.CustomerID,
      Customers.CompanyName,
      Orders.OrderID,
      Orders.OrderDate,
   Customers.CompanyName
FROM Customers
JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
ORDER BY [Customer!1!CustomerID], [Order!2!OrderID]
FOR XML EXPLICIT

/* element */

SELECT 1                     as Tag,
   NULL                      as Parent,
   Customers.CustomerID   as [Customer!1!CustomerID],
   Customers.CompanyName     as [Customer!1!CompanyName],
      NULL                   as [Order!2!OrderID],
      NULL                   as [Order!2!OrderDate!element]
FROM Customers
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'

UNION ALL

SELECT 2,
      1,
   Customers.CustomerID,
   Customers.CompanyName,
   Orders.OrderID,
   Orders.OrderDate
FROM Customers
JOIN Orders
ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
ORDER BY [Customer!1!CustomerID], [Order!2!OrderID]
FOR XML EXPLICIT

/* hide */

SELECT 1                  as Tag,
   NULL                   as Parent,
   ProductID              as [Product!1!ProductID],
      CategoryID      as [Product!1!CategoryID],
   NULL                              as [Order!2!OrderID],
   NULL                              as [Order!2!OrderDate]
FROM Products

UNION ALL

SELECT 2,
   1,
   p.ProductID,
      p.CategoryID,
   od.OrderID,
   o.OrderDate
FROM Products AS p
JOIN [Order Details] AS od
 ON p.ProductID = od.ProductID
JOIN Orders AS o
 ON od.OrderID = o.OrderID
WHERE o.OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
ORDER BY [Product!1!CategoryID],[Product!1!ProductID], [Order!2!OrderID]
FOR XML EXPLICIT


SELECT 1                  as Tag,
   NULL                   as Parent,
   ProductID              as [Product!1!ProductID],
      CategoryID          as [Product!1!CategoryID!hide],
   NULL               as [Order!2!OrderID],
   NULL               as [Order!2!OrderDate]
FROM Products

UNION ALL

SELECT 2,
   1,
   p.ProductID,
      p.CategoryID,
   od.OrderID,
   o.OrderDate
FROM Products AS p
JOIN [Order Details] AS od
 ON p.ProductID = od.ProductID
JOIN Orders AS o
 ON od.OrderID = o.OrderID
WHERE o.OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
ORDER BY [Product!1!CategoryID!hide],[Product!1!ProductID], [Order!2!OrderID]
FOR XML EXPLICIT

/* id, idref i idrefs */

SELECT 1                     as Tag,
   NULL                           as Parent,
   ProductID                      as [Product!1!ProductID!ID],
      CategoryID                  as [Product!1!CategoryID!hide],
   NULL                      as [Order!2!OrderID],
   NULL                      as [Order!2!ProductID!idref],
   NULL                      as [Order!2!OrderDate]
FROM Products

UNION ALL

SELECT 2,
   1,
   p.ProductID,
      p.CategoryID,
   od.OrderID,
	 od.ProductID,
   o.OrderDate
FROM Products AS p
JOIN [Order Details] AS od
 ON p.ProductID = od.ProductID
JOIN Orders AS o
 ON od.OrderID = o.OrderID
WHERE o.OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
ORDER BY [Product!1!CategoryID!hide],[Product!1!ProductID!ID], [Order!2!OrderID]
FOR XML EXPLICIT, XMLDATA


SELECT 1                  as Tag,
   NULL               as Parent,
   ProductID              as [Product!1!ProductID],
      CategoryID          as [Product!1!CategoryID!hide],
   NULL                   as [Product!1!OrderList!idrefs],
   NULL                   as [Order!2!OrderID!id],
   NULL                   as [Order!2!OrderDate]
FROM Products

UNION ALL

SELECT 1,
   NULL,
   p.ProductID,
      p.CategoryID,
   'id' + CAST(od.OrderID AS varchar),
   NULL,
   NULL
FROM Products AS p
JOIN [Order Details] AS od
 ON p.ProductID = od.ProductID
JOIN Orders AS o
 ON od.OrderID = o.OrderID
WHERE o.OrderDate BETWEEN '1998-01-01' AND '1998-01-07'

UNION ALL

SELECT 2,
   1,
   p.ProductID,
      p.CategoryID,
   NULL,
   'id' + CAST(od.OrderID AS varchar),
   o.OrderDate
FROM Products AS p
JOIN [Order Details] AS od
 ON p.ProductID = od.ProductID
JOIN Orders AS o
 ON od.OrderID = o.OrderID
WHERE o.OrderDate BETWEEN '1998-01-01' AND '1998-01-07'
ORDER BY [Product!1!CategoryID!hide],[Order!2!OrderID!id],
[Product!1!OrderList!idrefs]
FOR XML EXPLICIT, XMLDATA


/* cdata */

SELECT 1                  as Tag,
   NULL                   as Parent,
   Employees.EmployeeID   as [Employee!1!EmployeeID],
   Employees.Notes        as [Employee!1!!cdata]
FROM EMployees
ORDER BY [Employee!1!EmployeeID]
FOR XML EXPLICIT

/* Nienazwane kolumny */

USE Northwind

SELECT Customers.CustomerID,
   COUNT(Orders.OrderID)
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH

/* @ */

SELECT Customers.CustomerID AS '@CustomerID',
   COUNT(Orders.OrderID)
FROM Customers
JOIN Orders
  ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH

SELECT Customers.CustomerID AS '@CustomerID',
   COUNT(Orders.OrderID) AS '@OrderCount'
FROM Customers
JOIN Orders
  ON Customers.CustomerID = Orders.CustomerID

WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH

/* z bdem */

SELECT Customers.CustomerID,
   COUNT(Orders.OrderID) AS '@OrderCount'
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH

/* / */

SELECT Customers.CustomerID,
   COUNT(Orders.OrderID) AS 'CustomerID/OrderCount'
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' or Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH

/* z bdem */

SELECT Customers.CustomerID,
   COUNT(Orders.OrderID) AS 'CustomerID/@OrderCount'
FROM Customers
JOIN Orders
   ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH


SELECT COUNT(Orders.OrderID) AS 'CustomerID/@OrderCount',
   Customers.CustomerID AS 'CustomerID'
FROM Customers
JOIN Orders
  ON Customers.CustomerID = Orders.CustomerID
WHERE Customers.CustomerID = 'ALFKI' OR Customers.CustomerID = 'ANTON'
GROUP BY Customers.CustomerID
FOR XML PATH

/* OPENXML */

USE Northwind

DECLARE @idoc        int
DECLARE @xmldoc      nvarchar(4000)

-- Zdefiniuj dokument XML
SET @xmldoc = '
<ROOT>
<Shipper ShipperID="100" CompanyName="Billy Bob&apos;s Pretty Good Shipping"/>
<Shipper ShipperID="101" CompanyName="Fred&apos;s Freight"/>
</ROOT>
'

-- Zaaduj dokument XML do pamici i sparsuj go
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmldoc

-- Wypisz, jak wyglda tabela Shippers przed wstawieniem
SELECT * FROM Shippers

-- ShipperID jest kolumn identyfikujc, wic musimy zezwoli na jej bezporeni aktualizacj
SET IDENTITY_INSERT Shippers ON

-- Obejrzyjmy dane XML w postaci tabelarycznej
SELECT * FROM OPENXML (@idoc, '/ROOT/Shipper', 0) WITH (
   ShipperID         int,
CompanyName            nvarchar(40))

-- Przetwrz i wstaw oparte o to dane
INSERT INTO Shippers
(ShipperID, CompanyName)
SELECT * FROM OPENXML (@idoc, '/ROOT/Shipper', 0) WITH (
   ShipperID         int,
CompanyName            nvarchar(40))

-- Wr do stanu normalnego
SET IDENTITY_INSERT Shippers OFF

-- Obejrzyjmy tabel Shippers po wstawieniu
SELECT * FROM Shippers 

-- Wyczy pami po dokumencie XML
EXEC sp_xml_removedocument @idoc

/* dodatkowe opcje OPENXML */

DECLARE @idoc int
DECLARE @doc varchar(4000)
-- Dokument XML pochodzcy z FOR XML EXPLICIT
SET @doc ='
<root>
<Product ProductID="1" CategoryID="1" />
<Product ProductID="2" CategoryID="1">
 <Order OrderID="10813" OrderDate="1998-01-05T00:00:00" />
</Product>
<Product ProductID="24" CategoryID="1" />
<Product ProductID="34" CategoryID="1" />
<Product ProductID="35" CategoryID="1" />
<Product ProductID="38" CategoryID="1">
 <Order OrderID="10816" OrderDate="1998-01-06T00:00:00" />
 <Order OrderID="10817" OrderDate="1998-01-06T00:00:00" />
</Product>
<Product ProductID="39" CategoryID="1" />
<Product ProductID="43" CategoryID="1">
 <Order OrderID="10814" OrderDate="1998-01-05T00:00:00" />
 <Order OrderID="10819" OrderDate="1998-01-07T00:00:00" />
</Product>
<Product ProductID="67" CategoryID="1" />
<Product ProductID="70" CategoryID="1">
 <Order OrderID="10810" OrderDate="1998-01-01T00:00:00" />
</Product>
</root>
'
-- Utwrz wewntrzn wersj dokumentu XML
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

-- Wykonaj instrukcj SELECT wykorzystujc zestaw wierszy dostarczony przez OPENXML
SELECT *
FROM OPENXML (@idoc, '/root/Product/Order', 1)
   WITH (ProductID int '../@ProductID',
        Category int '../@CategoryID',
        OrderID int '@OrderID',
        OrderDate varchar(19) '@OrderDate',
        Previous varchar(10) '@mp:prev')
EXEC sp_xml_removedocument @idoc


/* Dwa sowa o XSLT */

<?xml version="1.0" encoding="UTF-8"?>
<root>
 <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste">
         <Products ProductID="28" ProductName="Rossle Sauerkraut"/>
         <Products ProductID="39" ProductName="Chartreuse verte"/>
         <Products ProductID="46" ProductName="Spegesild"/>
</Customer>
<Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils">
         <Products ProductID="28" ProductName="Rossle Sauerkraut"/>
         <Products ProductID="29" ProductName="Thuringer Rostbratwurst"/>
         <Products ProductID="31" ProductName="Gorgonzola Telino"/>
         <Products ProductID="38" ProductName="Cote de Blaye"/>
         <Products ProductID="39" ProductName="Chartreuse verte"/>
         <Products ProductID="41" ProductName="Jack&apos;s New England Clam Chowder"/>
         <Products ProductID="46" ProductName="Spegesild"/>
         <Products ProductID="49" ProductName="Maxilaku"/>
 </Customer>
</root>

/* przeformatowanie na nowy wygld */

<?xml version="1.0" encoding="UTF-8"?>
<root>
<Products ProductID="28" ProductName="Rossle Sauerkraut">
      <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/>
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="29" ProductName="Thuringer Rostbratwurst">
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="31" ProductName="Gorgonzola Telino">
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="38" ProductName="Cote de Blaye">
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="39" ProductName="Chertreuse verte">
      <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/>
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="41" ProductName="Jack&apos;s New England Clam Chowder">
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="46" ProductName="Spegesild">
      <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste"/>
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
<Products ProductID="49" ProductName="Maxilaku">
      <Customer CustomerID="BLONP" CompanyName="Blondesddsl pere et fils"/>
</Products>
</root>
