Sql server 使用sql查询创建嵌入式列xml

Sql server 使用sql查询创建嵌入式列xml,sql-server,Sql Server,我有一张表,里面有下面的记录 +------------+---------+ | State |Strength | +------------+---------+ | AR | 10000 | | AK | 20000 | +------------+---------+ 我想以下面的格式介绍通用xml <Fields><AR>10000</AR><AK>20000</AK>&l

我有一张表,里面有下面的记录

+------------+---------+
|    State   |Strength |
+------------+---------+
| AR         | 10000   |
| AK         | 20000   |
+------------+---------+
我想以下面的格式介绍通用xml

<Fields><AR>10000</AR><AK>20000</AK></Fields>
1000020000
到目前为止我都试过了

SELECT '<'+State+'>' + Strength+'</'+State+'>'
FROM tbl
FOR XML PATH (''), ROOT('Fields')
选择“”+强度+“”
来自tbl
对于XML路径(“”),根(‘字段’)

结果我得到-
AR10000/ark20000/AK

您应该对xml路径和
value
方法使用
type

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)') 
将@SampleData声明为表(State varchar(20),Strength int)
插入@SampleData
价值('AR',10000),('AK',20000),('MP',30000)
选择(选择混凝土(“”,标准强度“”)
来自@SampleData sd
对于XML路径(“”),键入.value(“[1]”,“[nvarchar(max)”)
参考链接:

或者像这样的简单查询

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
将@SampleData声明为表(State varchar(20),Strength int)
插入@SampleData
价值('AR',10000),('AK',20000),('MP',30000)
声明@xml nvarchar(max)=N“”
选择@xml+=CONCAT(“”,sd.Strength“”)
来自@SampleData sd
设置@xml+=N“”
选择@xml

对于xml路径和
方法,应该使用
类型

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)') 
将@SampleData声明为表(State varchar(20),Strength int)
插入@SampleData
价值('AR',10000),('AK',20000),('MP',30000)
选择(选择混凝土(“”,标准强度“”)
来自@SampleData sd
对于XML路径(“”),键入.value(“[1]”,“[nvarchar(max)”)
参考链接:

或者像这样的简单查询

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
将@SampleData声明为表(State varchar(20),Strength int)
插入@SampleData
价值('AR',10000),('AK',20000),('MP',30000)
声明@xml nvarchar(max)=N“”
选择@xml+=CONCAT(“”,sd.Strength“”)
来自@SampleData sd
设置@xml+=N“”
选择@xml

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 ('+@SQL+') )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')
静态

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 ('+@SQL+') )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>

20000
10000

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 ('+@SQL+') )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')
静态

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 ('+@SQL+') )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>

20000
10000

它可能会帮助您它可能会帮助您谢谢!!我使用的是SQL Server 2008,没有CONCAT函数。然而,我能够手动附加它们并使其工作<代码>选择@xml+='谢谢!!我使用的是SQL Server 2008,没有CONCAT函数。然而,我能够手动附加它们并使其工作<代码>选择@xml+='