Sql 将XML数据获取到表中

Sql 将XML数据获取到表中,sql,sql-server,xml,sql-server-2008,Sql,Sql Server,Xml,Sql Server 2008,我有以下XML <Queue> <UserName>UserName</UserName> <Type>1</Type> <Portal name="Portal1"> <IndexesForSelect> <Index>Index1</Index> <Index>Index2</In

我有以下XML

<Queue>
    <UserName>UserName</UserName>
    <Type>1</Type>
    <Portal name="Portal1">
        <IndexesForSelect>
            <Index>Index1</Index>
            <Index>Index2</Index>
        </IndexesForSelect>
    </Portal>
    <Portal name="Portal2">
        <IndexesForSelect>
            <Index>Index3</Index>
            <Index>Index4</Index>
        </IndexesForSelect>
    </Portal>
</Queue>
如果有人能帮助我,我真的很感激

我尝试了以下代码,但它只返回每个
门户的第一个
索引

declare @T table
(
  XMLCol xml
)

insert into @T values
('<Queue>
      <UserName>UserName</UserName>
      <Type>1</Type>
      <Portal name="Portal1">
        <IndexesForSelect>
          <Index>Index1</Index>
          <Index>Index2</Index>
        </IndexesForSelect>
      </Portal>
      <Portal name="Portal2">
        <IndexesForSelect>
          <Index>Index3</Index>
          <Index>Index4</Index>
        </IndexesForSelect>
      </Portal>
    </Queue>')
SELECT  items.value('../@name','varchar(max)') AS [Portal],
        items.value('(Index)[1]','varchar(max)') AS [Index]
FROM @T AS T CROSS APPLY T.XMLCol.nodes('Queue/Portal/IndexesForSelect') c (items)
declare@T表
(
xmlcolxml
)
插入到@T值中
('
用户名
1.
Index1
Index2
Index3
Index4
')
选择items.value(“../@name”,“varchar(max)”作为[Portal],
items.value('(Index)[1],'varchar(max)')作为[索引]
从@T AS T交叉应用T.XMLCol.nodes('Queue/Portal/indexsforselect')c(项)

尝试使用SQL management studio提供的导出/导入功能


要了解它,请尝试使用SQL management studio提供的导出/导入功能


要了解它

谢谢你,米凯尔,这很管用。但我找到了另一种方法,它的查询成本比这一种要低。非常感谢您的帮助从@xml.nodes('///Queue/Portal/indexsforselect/Index')中选择items.value('../../@name','varchar(50)'作为[Portal],items.value('.','varchar(50)')作为[Index])T(items)谢谢您,Mikael这是有效的。但我找到了另一种方法,它的查询成本比这一种要低。非常感谢您的帮助从@xml.nodes('///Queue/Portal/indexsforselect/Index')T(items)中选择items.value('../../@name','varchar(50)'作为[Portal],items.value('.','varchar(50)'作为[Index])
declare @T table
(
  XMLCol xml
)

insert into @T values
('<Queue>
      <UserName>UserName</UserName>
      <Type>1</Type>
      <Portal name="Portal1">
        <IndexesForSelect>
          <Index>Index1</Index>
          <Index>Index2</Index>
        </IndexesForSelect>
      </Portal>
      <Portal name="Portal2">
        <IndexesForSelect>
          <Index>Index3</Index>
          <Index>Index4</Index>
        </IndexesForSelect>
      </Portal>
    </Queue>')
SELECT  items.value('../@name','varchar(max)') AS [Portal],
        items.value('(Index)[1]','varchar(max)') AS [Index]
FROM @T AS T CROSS APPLY T.XMLCol.nodes('Queue/Portal/IndexesForSelect') c (items)
select T1.N.value('@name', 'varchar(max)') as Portal,
       T2.N.value('.', 'varchar(max)') as [Indes]
from @T as T
  cross apply XMLCol.nodes('/Queue/Portal') as T1(N)
  cross apply T1.N.nodes('IndexesForSelect/Index') as T2(N)