从XML字符串SQL中获取多个答案

时间:2014-06-25 08:55:38

标签: sql xml loops reporting-services varcharmax

我将一个XML文档保存在列中作为varchar(max)。我想要的文字被<Text> Words I Want</Text>包围,但这些文字标签有时重复4或5次。

如何根据文本标签的数量循环遍历同一文档x次?

目前我正在使用它来提取文本的第一位

 DECLARE @first_char nvarchar(10)
DECLARE @second_char nvarchar(10)

SET @first_char = 'xt>';
SET @second_char = '</text>';

SELECT[TestId]
      ,[SectionId],
SUBSTRING
(
-- column
 settings
-- start position
,CHARINDEX(@first_char, Settings , 1) + 3
-- length
,CASE
WHEN (CHARINDEX(@second_char, Settings , 0) - CHARINDEX(@first_char, Settings, 0)) > 0
THEN CHARINDEX(@second_char, Settings, 0) - CHARINDEX(@first_char, Settings, 0) - 3
ELSE 0
END
) AS Response
FROM [B2IK-TestBuilder].[dbo].[Questions] 
group by [TestId]
      ,[SectionId], settings

我知道Text标签出现了多少次。

这是保存varchar(max)的xml文档的示例:

<Settings>
  <ShowNotes>true</ShowNotes>
  <ShowComment>false</ShowComment>
  <TextBefore>From the six safety essentials, a </TextBefore>
  <TextAfter>is essential before any work is carried out?</TextAfter>
  <Items>
    <Item>
      <Text>Answer 1</Text>
    </Item>
    <Item>
      <Text>Answer 2</Text>
    </Item>
    <Item>
      <Text>Answer 3</Text>
    </Item>
    <Item>
      <Text>Answer 4</Text>
    </Item>
    <Item>
      <Text>Answer 5</Text>
    </Item>
    <Item>
      <Text>Answer 6</Text>
    </Item>

提前谢谢。

1 个答案:

答案 0 :(得分:1)

确定,因为SQL 2005可以使用XPath来查询数据。我建议在“设置”列中使用XML列类型。然后,您可以使用CROSS APPLY获取Item节点。

SELECT q.TestId,q.SectionId,x.XmlCol.value('(Text)[1]','VARCHAR(MAX)') 
    FROM Questions q
CROSS APPLY q.settings.nodes('/Settings/Items/Item') x(XmlCol);

如果由于某种原因无法更改设置列的类型,则可以在声明中将其强制转换。

SELECT q.TestId,q.SectionId,x.XmlCol.value('(Text)[1]','VARCHAR(MAX)') 
    FROM (SELECT TestId,SectionId, cast([settings] as xml) as Data FROM Questions) q
CROSS APPLY q.settings.nodes('/Settings/Items/Item') x(XmlCol);