SQL Server數(shù)據(jù)庫中FOR XML AUTO的使用詳解續(xù)
之前我們介紹過:SQL Server數(shù)據(jù)庫中FOR XML AUTO的使用詳解,本文我們介紹一些稍微復(fù)雜的應(yīng)用,首先我們先看下面的代碼:
- CREATE TABLE Person(
- ID INT IDENTITY(1,1) NOT NULL,
- Name NVARCHAR(20) NOT NULL DEFAULT(''),
- Age INT DEFAULT(0) NOT NULL,
- Sex BIT DEFAULT(0) NOT NULL
- )
- --DROP TABLE [Order]
- CREATE TABLE [Order](
- ID INT IDENTITY(1,1) PRIMARY KEY,
- PersonID INT DEFAULT(0) NOT NULL,
- TotalPrice DECIMAL DEFAULT(0) NOT NULL
- )
- CREATE TABLE Product(
- ID INT IDENTITY(1,1) PRIMARY KEY,
- Price DECIMAL(8,2) DEFAULT(0.00) NOT NULL,
- Img NVARCHAR(50) DEFAULT('') NOT NULL
- )
- CREATE TABLE OrderDetail(
- ID INT IDENTITY(1,1) PRIMARY KEY,
- OrderID INT DEFAULT(0) NOT NULL,
- ProductID INT DEFAULT(0) NOT NULL,
- Price DECIMAL(8,2) DEFAULT(0.00) NOT NULL
- )
- INSERT INTO Person(Name,Age,Sex)
- SELECT '張三',28,1 UNION ALL
- SELECT '李四',28,1 UNION ALL
- SELECT '王五',28,1
- INSERT INTO [Order](PersonID,TotalPrice)
- SELECT 1,100.0 UNION ALL
- SELECT 1,111.0 UNION ALL
- SELECT 2,112.0 UNION ALL
- SELECT 3,98.0 UNION ALL
- SELECT 3,150.49 UNION ALL
- SELECT 3,58
- INSERT INTO Product(Price,Img)
- SELECT 101.0,'1.png' UNION ALL
- SELECT 102.0,'2.png' UNION ALL
- SELECT 103.0,'3.png' UNION ALL
- SELECT 104.0,'4.png' UNION ALL
- SELECT 105.0,'5.png'
- INSERT INTO OrderDetail(OrderID,ProductID,Price)
- SELECT TOP 3 3,ID,Price FROM Product
- SELECT * FROM Person
- SELECT * FROM [Order]
- SELECT * FROM Product
- SELECT * FROM OrderDetail
- Person
- ID Name Age Sex
- ----------- -------------------- ----------- -----
- 1 張三 28 1
- 2 李四 28 1
- 3 王五 28 1
- (3 行受影響)
- [Order]
- ID PersonID TotalPrice
- ----------- ----------- ---------------------------------------
- 1 1 100
- 2 1 111
- 3 2 112
- 4 3 98
- 5 3 150
- 6 3 58
- (6 行受影響)
- Product
- ID Price Img
- ----------- --------------------------------------- --------------------------------------------------
- 1 101.00 1.png
- 2 102.00 2.png
- 3 103.00 3.png
- 4 104.00 4.png
- 5 105.00 5.png
- (5 行受影響)
- OrderDetail
- ID OrderID ProductID Price
- ----------- ----------- ----------- ---------------------------------------
- 1 1 1 101.00
- 2 1 2 102.00
- 3 1 3 103.00
- 4 1 4 104.00
- 5 1 5 105.00
- 6 2 1 101.00
- 7 2 2 102.00
- 8 2 3 103.00
- 9 3 1 101.00
- 10 3 2 102.00
- 11 3 3 103.00
- (11 行受影響)
理下其中的關(guān)系:
會員表Person與訂單表Order為一對多關(guān)系,其中Order.PersonID = Person.ID
訂單表與訂單詳情表為一對多關(guān)系,其中OrderDetail.OrderID = Order.ID
產(chǎn)品表與訂單詳情表為一對多關(guān)系,其中OrderDetail.ProductID = Product.ID
如下圖1
圖1
可以開始了:
先來看有那些訂單,分別為誰的訂單,以及訂單詳情,SQL腳本及查詢結(jié)果如下:
- 1: SELECT
- 2: [Order].ID,
- 3: [Order].PersonID,
- 4: OrderDetail.OrderID,
- 5: OrderDetail.ProductID,
- 6: OrderDetail.Price
- 7: FROM [Order]
- 8: INNER JOIN OrderDetail ON [Order].ID = OrderDetail.OrderID
- 9: FOR XML AUTO,ROOT('Record')
查詢結(jié)果如下:
- 1: <Record>
- 2: <Order ID="1" PersonID="1">
- 3: <OrderDetail OrderID="1" ProductID="1" Price="101.00" />
- 4: <OrderDetail OrderID="1" ProductID="2" Price="102.00" />
- 5: <OrderDetail OrderID="1" ProductID="3" Price="103.00" />
- 6: <OrderDetail OrderID="1" ProductID="4" Price="104.00" />
- 7: <OrderDetail OrderID="1" ProductID="5" Price="105.00" />
- 8: </Order>
- 9: <Order ID="2" PersonID="1">
- 10: <OrderDetail OrderID="2" ProductID="1" Price="101.00" />
- 11: <OrderDetail OrderID="2" ProductID="2" Price="102.00" />
- 12: <OrderDetail OrderID="2" ProductID="3" Price="103.00" />
- 13: </Order>
- 14: <Order ID="3" PersonID="2">
- 15: <OrderDetail OrderID="3" ProductID="1" Price="101.00" />
- 16: <OrderDetail OrderID="3" ProductID="2" Price="102.00" />
- 17: <OrderDetail OrderID="3" ProductID="3" Price="103.00" />
- 18: </Order>
- 19: </Record>
調(diào)整下查詢列的順序,再看下結(jié)果,變了?。?/p>
- SELECT
- OrderDetail.OrderID,
- OrderDetail.ProductID,
- OrderDetail.Price,
- [Order].ID,
- [Order].PersonID
- FROM [Order]
- INNER JOIN OrderDetail ON [Order].ID = OrderDetail.OrderID
- FOR XML AUTO,ROOT('Record')
輸出結(jié)果很猛:
- <Record>
- <OrderDetail OrderID="1" ProductID="1" Price="101.00">
- <Order ID="1" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="1" ProductID="2" Price="102.00">
- <Order ID="1" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="1" ProductID="3" Price="103.00">
- <Order ID="1" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="1" ProductID="4" Price="104.00">
- <Order ID="1" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="1" ProductID="5" Price="105.00">
- <Order ID="1" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="2" ProductID="1" Price="101.00">
- <Order ID="2" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="2" ProductID="2" Price="102.00">
- <Order ID="2" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="2" ProductID="3" Price="103.00">
- <Order ID="2" PersonID="1" />
- </OrderDetail>
- <OrderDetail OrderID="3" ProductID="1" Price="101.00">
- <Order ID="3" PersonID="2" />
- </OrderDetail>
- <OrderDetail OrderID="3" ProductID="2" Price="102.00">
- <Order ID="3" PersonID="2" />
- </OrderDetail>
- <OrderDetail OrderID="3" ProductID="3" Price="103.00">
- <Order ID="3" PersonID="2" />
- </OrderDetail>
- </Record>
XML結(jié)構(gòu)變了,是變了,MSDN中是這樣解釋滴:
***個ID引用自O(shè)rder表,故創(chuàng)建Order節(jié)點,PersonID同樣引用自O(shè)rder表,***步已經(jīng)創(chuàng)建Order節(jié)點,故此處僅為節(jié)點添加PersonID屬性。
接下來三列OrderID,ProductID,Price引用OrderDetail表,因此在Order節(jié)點下創(chuàng)建OrderDetail子節(jié)點 列的別名顯示為屬性名稱,沒有別名使用列名,節(jié)點的名稱使用表別名,沒有別名使用表名。
Order By對XML結(jié)構(gòu)的影響
再看個例子,對Order.PersonID排序:
- SELECT
- [Order].ID,
- [Order].PersonID,
- OrderDetail.OrderID,
- OrderDetail.ProductID,
- OrderDetail.Price
- FROM [Order]
- INNER JOIN OrderDetail ON [Order].ID = OrderDetail.OrderID
- ORDER BY [Order].PersonId
- FOR XML AUTO,ROOT('Record')
輸出結(jié)果:
- <Record>
- <Order ID="1" PersonID="1">
- <OrderDetail OrderID="1" ProductID="1" Price="101.00" />
- <OrderDetail OrderID="1" ProductID="2" Price="102.00" />
- <OrderDetail OrderID="1" ProductID="3" Price="103.00" />
- <OrderDetail OrderID="1" ProductID="4" Price="104.00" />
- <OrderDetail OrderID="1" ProductID="5" Price="105.00" />
- </Order>
- <Order ID="2" PersonID="1">
- <OrderDetail OrderID="2" ProductID="1" Price="101.00" />
- <OrderDetail OrderID="2" ProductID="2" Price="102.00" />
- <OrderDetail OrderID="2" ProductID="3" Price="103.00" />
- </Order>
- <Order ID="3" PersonID="2">
- <OrderDetail OrderID="3" ProductID="1" Price="101.00" />
- <OrderDetail OrderID="3" ProductID="2" Price="102.00" />
- <OrderDetail OrderID="3" ProductID="3" Price="103.00" />
- </Order>
- </Record>
其實這個結(jié)果與***個查詢結(jié)果是一樣滴,行默認(rèn)順序會影響XML結(jié)果,排序也會影響XML結(jié)構(gòu),只要當(dāng)前行與上一行數(shù)據(jù)可以合并時,就會影響XML結(jié)構(gòu),再來看一個排序影響XML結(jié)構(gòu)的例子,這次以O(shè)rderDetail.ProductID排序,直接看結(jié)果:
- <Record>
- <Order ID="1" PersonID="1">
- <OrderDetail OrderID="1" ProductID="1" Price="101.00" />
- </Order>
- <Order ID="2" PersonID="1">
- <OrderDetail OrderID="2" ProductID="1" Price="101.00" />
- </Order>
- <Order ID="3" PersonID="2">
- <OrderDetail OrderID="3" ProductID="1" Price="101.00" />
- <OrderDetail OrderID="3" ProductID="2" Price="102.00" />
- </Order>
- <Order ID="2" PersonID="1">
- <OrderDetail OrderID="2" ProductID="2" Price="102.00" />
- </Order>
- <Order ID="1" PersonID="1">
- <OrderDetail OrderID="1" ProductID="2" Price="102.00" />
- <OrderDetail OrderID="1" ProductID="3" Price="103.00" />
- </Order>
- <Order ID="2" PersonID="1">
- <OrderDetail OrderID="2" ProductID="3" Price="103.00" />
- </Order>
- <Order ID="3" PersonID="2">
- <OrderDetail OrderID="3" ProductID="3" Price="103.00" />
- </Order>
- <Order ID="1" PersonID="1">
- <OrderDetail OrderID="1" ProductID="4" Price="104.00" />
- <OrderDetail OrderID="1" ProductID="5" Price="105.00" />
- </Order>
- </Record>
以上就是FOR XML AUTO的應(yīng)用的相關(guān)知識,本文我們就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






