2017-04-08 20 views
0

我有一個表中有下面的記錄。使用SQL查詢創建嵌入列xml

+------------+---------+ 
| State |Strength | 
+------------+---------+ 
| AR   | 10000 | 
| AK   | 20000 | 
+------------+---------+ 

我想一般的XML在下面的格式

<Fields><AR>10000</AR><AK>20000</AK></Fields> 

我到目前爲止已經試過。

SELECT '<'+State+'>' + Strength+'</'+State+'>' 
FROM tbl 
FOR XML PATH (''), ROOT('Fields') 

結果我得到 - <Fields>&lt;AR&gt;10000&lt;/AR&gt;&lt;AK&gt;20000&lt;/AK&gt;</Fields>

+1

它可以幫助你https://www.simple-talk.com/sql/learn-sql-server/using-the-for-xml-clause-to-return-query -results-as-xml/ –

回答

2

您應該使用type對XML路徑和value方法

DECLARE @SampleData AS TABLE (State varchar(20), Strength int) 
INSERT INTO @SampleData 
VALUES ('AR', 10000), ('AK', 20000) ,('MP', 30000) 

SELECT (SELECT CONCAT('<',sd.State,'>', sd.Strength, '</',sd.State, '>') 
FROM @SampleData sd 
FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)') 

參考鏈接:Type for xml sql

或簡單的查詢像

DECLARE @SampleData AS TABLE (State varchar(20), Strength int) 
INSERT INTO @SampleData 
VALUES ('AR', 10000), ('AK', 20000) ,('MP', 30000) 

DECLARE @xml nvarchar(max) = N'<Fields>' 
SELECT @xml += CONCAT('<',sd.State,'>', sd.Strength, '</',sd.State, '>') 
FROM @SampleData sd 

SET @xml += N'</ Fields>' 

SELECT @xml 
+0

謝謝!我正在使用SQL Server 2008,並沒有CONCAT功能。但是,我能夠手動追加它們並使其工作。 'SELECT @xml + ='<'+ sd,State +等等' – Krishna

1

TRIV的將是我的第一選擇(已+1)

但是,另一種選擇(只是爲了好玩)通過擺動......是否是動態的

動態

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([State]) From tbl Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select * 
From (
     Select * 
     From (
       Select Col=[State] 
         ,Val=[Strength] 
        From tbl 
       ) A 
     Pivot (max([Val]) For [Col] in ('[email protected]+'))p 
     ) A 
for XML Path(''''),Root(''Fields'') 
' 
Exec(@SQL) 

靜態

Select * 
From (
     Select * 
     From (
       Select Col=[State] 
         ,Val=[Strength] 
        From tbl 
       ) A 
     Pivot (max([Val]) For [Col] in ([AK],[AR]))p 
     ) A 
for XML Path(''),Root('Fields') 

都返回

<Fields> 
    <AK>20000</AK> 
    <AR>10000</AR> 
</Fields> 
+0

非常感謝您的回答。我很感激。 – Krishna