mssql for xml path使用

準備工做:mysql

CREATE TABLE [dbo].[Students](sql

    [id] [int] IDENTITY(1,1) NOT NULL,測試

    [names] [varchar](50) NULL,spa

    [hobby] [varchar](50) NULLxml

)ci

 

insert into students values('張三','書法'),('張三','籃球'),('張三','檯球'),('李四','書法'),('李四','唱歌'),('李四','足球'),('李四','乒乓球')字符串

 

 

 

for xml pathit

把查詢結果用xml表現出來。table

1 正常的查詢:select

select * from Students

結果是:

 

id names hobby
----------- --------------------------------------------------
1 張三 書法
2 張三 籃球
3 張三 檯球
4 李四 書法
5 李四 唱歌
6 李四 足球
7 李四 乒乓球

 

返回的是一個數據表格(多條)。

2 用xml表現

select * from Students for xml path

結果是:

 

XML_F52E2B61-18A1-11d1-B105-00805F49916B
------------------------------------------------------------------------------------
<row><id>1</id><names>張三</names><hobby>書法</hobby></row><row><id>2</id><names>張三</names><hobby>籃球</hobby></row

><row><id>3</id><names>張三</names><hobby>檯球</hobby></row><row><id>4</id><names>李四</names><hobby>書法</hobby></row>

<row><id>5</id><names>李四</names><hob

也是一個數據表格(單條) 

把查詢結果作爲xml數據格式返回了一行數據。

3 經過使用path()參數,可改變列節點:

select * from Students for xml path('')

結果:

 

XML_F52E2B61-18A1-11d1-B105-00805F49916B
-----------------------------------------------------------------------------------
<id>1</id><names>張三</names><hobby>書法</hobby><id>2</id><names>張三</names><hobby>籃球</hobby>

<id>3</id><names>張三</names><hobby>檯球</hobby><id>4</id><names>李四</names><hobby>書法</hobby>

<id>5</id><names>李四</names><hobby>唱歌</hobby><id>6</id><names>李四</names><hobby>足球

使用path(‘’)空參數,去掉了row節點,直接顯示的是兩個屬性字段。

4 自定義節點

select * from Students for xml path('selfNode')

結果以下:

XML_F52E2B61-18A1-11d1-B105-00805F49916B
--------------------------------------------------------------------------------------------
<selfNode><id>1</id><names>張三</names><hobby>書法</hobby></selfNode>

<selfNode><id>2</id><names>張三</names><hobby>籃球</hobby></selfNode>

<selfNode><id>3</id><names>張三</names><hobby>檯球</hobby></selfNode>

<selfNode><id>4</id><names>李四</names><hobby>書法</hobby></selfNode>

 

總的來講,for xml path返回的是一條數據(一個xml字串)。因此,這個能夠做爲查詢中的一列。以下:

select distinct aaa.names,hobby=(

SELECT hobby+',' FROM students

  WHERE names=aaa.names

  FOR XML PATH('') 

  ) 

  from students aaa

結果以下:

 

names hobby
-------------------------------------------------- 
李四 書法,唱歌,足球,乒乓球,
張三 書法,籃球,檯球,

從students表中查詢names,且各自的hobby,hobby是多條記錄,經過xml 整合到一條記錄,並使用逗點分隔。

上面的語句中有一句:where names=aaa.names,由於for xml path返回的是一條數據字串,不能進行查詢條件的關聯,即不能作爲數據表與其它表進行關聯。 

它只返回一行一列,且for xml path都整合到一字符串中而沒有其它字段,因此不能與其它表進行聯合查詢。但能夠在for xml以前進行聯合查詢,以下:

select distinct aaa.names,hobby=(

select hobby+',' FROM students

  where names=aaa.names

  for xml path('')

  )   from students aaa 

for xml path部分的結果作爲一個字段顯示,而粗體部分表示把每一個names中的hobby字段經過逗號連成一個字段,以下:

names hobby
--------------------------------------------------
李四 書法,唱歌,足球,乒乓球,
張三 書法,籃球,檯球, 

未使用distinct,結果以下: 

names hobby
--------------------------------------------------
張三 書法,籃球,檯球,
張三 書法,籃球,檯球,
張三 書法,籃球,檯球,
李四 書法,唱歌,足球,乒乓球,
李四 書法,唱歌,足球,乒乓球,
李四 書法,唱歌,足球,乒乓球,
李四 書法,唱歌,足球,乒乓球,

把重複的去掉,可經過group或distinct去掉

 

 另外:對於可容忍的髒讀而不死鎖的with onlock在mssql中可在表後邊使用with(nolock)髒讀;今天查了一下,對於mysql來講,不須要使用with nolock,會自動使用nolock. 。這個我本身未作過測試,大概只是瞭解一下。

相關文章
相關標籤/搜索