無意中閱讀了一個使用for xml path來取以逗號分隔的多行資料的應用,之前只是用過for xml auto,為了弄清之間的差異,特地去msdn補習了一下。
在此列出來,mark一下學習結果。有需要詳細學習,請自行登入msdn
for xml後面除了以上兩個修飾符外,還有兩個修飾符,一共有四種,分別是:
1、RAW
2、AUTO
3、PATH
4、EXPLICIT
基本上是按照功能的強弱正序排列的,閑話少說,直接看代碼:
for xml學習
--RAW--SELECT CorpCode FROM dbo.Kvp_CorpInfo FOR XML AUTO('')--僅FOR XML 的RAW 或PATH 模式允許行標記名稱。SELECT CorpCode FROM dbo.Kvp_CorpInfo FOR XML RAW('')--行標記省略(空的行標記名稱)不能與以屬性為中心的FOR XML 序列化一起使用。?SELECT CorpCode FROM dbo.Kvp_CorpInfo FOR XML RAW(''),elements SELECT TOP 100 productid,productnameFROM dbo.Bas_ProductInfoFOR XML RAW, elements;--FOR XML RAW, Type;--結果命名不同.msdn:您可以選擇性地指定TYPE 指令將結果作為xml 類型進行檢索。TYPE 指令不會更改結果的內容。隻影響結果的資料類型。 --AutoSELECT TOP 1 productid,productnameFROM dbo.Bas_ProductInfo AFOR XML AUTO, elements;--交叉資料的嵌套順序SELECT OrderInfo.SalesOrderID,OrderInfo.TotalAmount,OrderList.SalesOrderID,OrderList.SalesOrderListId,OrderList.ProductId,OrderList.SelfPriceFROM dbo.Ope_SalesOrderRecord OrderInfo,dbo.Ope_SalesOrderList OrderListWHERE OrderInfo.SalesOrderID=OrderList.SalesOrderIDFOR XML AUTO,elementsSELECT OrderList.SalesOrderID,OrderList.SalesOrderListId,OrderList.ProductId,OrderList.SelfPrice,OrderInfo.SalesOrderID,OrderInfo.TotalAmountFROM dbo.Ope_SalesOrderRecord OrderInfo,dbo.Ope_SalesOrderList OrderListWHERE OrderInfo.SalesOrderID=OrderList.SalesOrderIDFOR XML AUTO/*在建立父元素的過程中,會對每個即將建立的父節點進行比較,如果值不同,將向XML 添加新的父元素,值相同則比較屬性,以此類推。在比較這些列值時,如果要比較的任何列是text、ntext、image 或xml 類型,即使它們的值可能相同,FOR XML 也將認為它們是不同的,並且不對其進行比較。這是因為不支援大型物件的比較。這些元素將被添加到每個選定行的結果中。請注意,會比較(n)varchar(max) 和varbinary(max) 類型的列。*/--EXPLICIT /*[適用於複雜結構的xml]常見格式:ElementName!TagNumber!AttributeName!DirectiveDirective:如果未指定Directive 和AttributeName(例如Customer!1),則暗含一個element 指令(如Customer!1!!element),並且列資料包含在ElementName 中。一種用途是將值編碼為ID、IDREF 和IDREFS。可以將ID、IDREF 和IDREFS 關鍵字指定為Directives。這些指令將覆蓋屬性類型。這使您能夠建立文檔內連結。另外hide、element、elementxsinil、xml、xmltext 和cdata除不發生實體編碼外,xml 指令與element 指令相同。http://msdn.microsoft.com/zh-cn/library/ms189068*/SELECT 1 as tag,null as parent,A.CorpCode AS [人員!1!姓名],NULL AS[人員資訊!2!年齡!xml] FROM dbo.Kvp_CorpInfo A WHERE CorpCode<>''UNIONSELECT 2 AS tag,1 AS parent,A.CorpCode,B.CorpId FROM dbo.Kvp_CorpInfo A,dbo.Kvp_CorpInfo B WHERE A.CorpCode<>'' AND a.CorpCode=b.CorpCodeorder by [人員!1!姓名],tag--此處排序以供節點嵌套FOR XML EXPLICIT--PATHSELECT 2+2 FOR XML PATH--值,xml:<row>4</row>SELECT 2+2 '@T' FOR XML PATH--屬性,xml:<row T="4" />SELECT 2+2 T FOR XML PATH--節點,xml:<row><T>4</T></row>SELECT 2+2 'T/F' FOR XML PATH--多級節點,xml:<row><T><F>4</F></T></row>--名稱指定為萬用字元的列/*如果指定的列名是一個萬用字元(*),則插入此列的內容時就像沒有指定列名那樣插入。如果此列不是xml 類型的列,則此列的內容將作為文本節點插入*/SELECT CorpCode '@Code',CorpCode '*',':' '*',CorpName '*'FROM dbo.Kvp_CorpInfo WHERE CorpCode<>''FOR XML PATH/*<row Code="0021">0021:北京**有限公司 </row><row Code="0006">0006:南京**有限公司 </row><row Code="0024">0024:上海**有限公司 </row><row Code="009A">009A:DCgou</row><row Code="0046">0046:北京**供應鏈服務有限公司</row><row Code="00X8">00X8:廣東**有限公司</row>*/SELECT RuleID,RuleName,Param.query('/Rule') '*'FROM dbo.Sys_RuleInfo WHERE RuleID=101150000000000011FOR XML PATH--列名為XPath-節點測試的列text()/comment()/node()SELECT 2+2 'text()' FOR XML PATH--=writetext();SELECT 2+2 'comment()' FOR XML PATH--=writecomment();SELECT 2+2 'node()' FOR XML PATH--=*--data()SELECT corpcode 'data()' FROM dbo.Kvp_CorpInfo WHERE CorpCode<>'' FOR XML PATH('')--xml:0021 0006 0024 009A 0046 00X8SELECT * FROM Sys_RuleInfo --使用path,擷取以分隔字元分隔的聚集字串SELECT CorpCode+',' FROM dbo.Kvp_CorpInfo WHERE CorpCode<>'' FOR XML PATH('')--xml:0021,0006,0024,009A,0046,00X8,SELECT ''''+CorpCode+''',' FROM dbo.Kvp_CorpInfo WHERE CorpCode<>'' FOR XML PATH('')--xml:'0021','0006','0024','009A','0046','00X8',