1: CREATE XML SCHEMA COLLECTION [dbo].[OrderXml] AS
2: N'<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
3: <xsd:element name="Root">
4: <xsd:complexType mixed="true">
5: <xsd:complexContent mixed="true">
6: <xsd:restriction base="xsd:anyType">
7: <xsd:sequence>
8: <xsd:element name="Order" maxOccurs="unbounded">
9: <xsd:complexType mixed="true">
10: <xsd:complexContent mixed="true">
11: <xsd:restriction base="xsd:anyType">
12: <xsd:sequence>
13: <xsd:element name="Lines" type="OrderDetailType" maxOccurs="unbounded" />
14: </xsd:sequence>
15: <xsd:attribute name="orderDate" type="xsd:string" use="required" />
16: <xsd:attribute name="orderNumber" type="xsd:string" use="required" />
17: <xsd:attribute name="channel" type="xsd:string" use="required" />
18: </xsd:restriction>
19: </xsd:complexContent>
20: </xsd:complexType>
21: </xsd:element>
22: </xsd:sequence>
23: </xsd:restriction>
24: </xsd:complexContent>
25: </xsd:complexType>
26: </xsd:element>
27: <xsd:complexType name="OrderDetailType" mixed="true">
28: <xsd:complexContent mixed="true">
29: <xsd:restriction base="xsd:anyType">
30: <xsd:choice maxOccurs="unbounded">
31: <xsd:element name="productName" type="xsd:string" />
32: <xsd:element name="quantity" type="xsd:string" />
33: <xsd:element name="value" type="xsd:string" />
34: </xsd:choice>
35: </xsd:restriction>
36: </xsd:complexContent>
37: </xsd:complexType>
38: </xsd:schema>'
39: GO
40:
41: CREATE TABLE [dbo].[OrderHeader]
42: (
43: [orderId] [uniqueidentifier] NOT NULL,
44: [orderNumber] [varchar](20) NOT NULL,
45: [orderDate] [datetime] NOT NULL,
46: [channel] [varchar](50) NULL,
47: CONSTRAINT [PK_OrderHeader] PRIMARY KEY CLUSTERED
48: (
49: [orderId] ASC
50: )
51: )
52: GO
53:
54: CREATE TABLE [dbo].[OrderLine]
55: (
56: [orderLineId] [int] IDENTITY(1,1) NOT NULL,
57: [orderId] [uniqueidentifier] NOT NULL,
58: [productName] [varchar](100) NOT NULL,
59: [quantity] [int] NOT NULL,
60: [value] [numeric](18, 3) NOT NULL,
61: CONSTRAINT [PK_OrderLine] PRIMARY KEY CLUSTERED
62: (
63: [orderLineId] ASC
64: )
65: )
66: GO
67:
68: /*
69: TEST STATEMENT:
70: -------------------------------
71: EXECUTE OrderInsert N'<Root>
72: <Order orderDate="20160101" orderNumber="000001" channel="Internet">
73: <Lines>
74: <productName>Portable Radio</productName>
75: <quantity>10</quantity>
76: <value>23.5</value>
77: </Lines>
78: <Lines>
79: <productName>6 red wine bottles</productName>
80: <quantity>20</quantity>
81: <value>30.9</value>
82: </Lines>
83: </Order>
84: </Root>'
85: -------------------------------
86: */
87: CREATE PROCEDURE [dbo].[OrderInsert]
88: @orderStream VARCHAR(MAX)
89: AS
90: BEGIN
91:
92: -- Fix Incoming XML: Logic App add a "?" char at the beginning of the string
93: SET @orderStream = REPLACE(@orderStream, '?<', '<');
94:
95: DECLARE @orderXml XML(OrderXml) = CAST(@orderStream AS XML(OrderXml));
96: DECLARE @orderId UNIQUEIDENTIFIER = NEWID();
97:
98: INSERT INTO OrderHeader
99: (
100: orderId,
101: orderNumber,
102: orderDate,
103: channel
104: )
105: SELECT
106: @orderId,
107: orderNumber = OrderObject.Header.value('./@orderNumber', 'varchar(20)'),
108: orderDate = OrderObject.Header.value('./@orderDate', 'datetime'),
109: channel = OrderObject.Header.value('./@channel', 'varchar(50)')
110: FROM
111: @orderXml.nodes('/Root/Order') AS OrderObject(Header);
112:
113: INSERT INTO OrderLine
114: (
115: orderId,
116: productName,
117: quantity,
118: value
119: )
120: SELECT
121: @orderId,
122: productName = OrderObject.Lines.value('./productName[1]', 'varchar(100)'),
123: quantity = OrderObject.Lines.value('./quantity[1]', 'int'),
124: value = OrderObject.Lines.value('./value[1]', 'numeric(18,3)')
125: FROM
126: @orderXml.nodes('/Root/Order/Lines') AS OrderObject(Lines);
127:
128: END
129: GO