SELECT查询从xml数据类型

时间:2018-06-15 19:05:59

标签: sql sql-server xml database tsql

我有以下SQL脚本(以及底部的XML结构):

DECLARE @questions XML

SELECT 
    t.Col.value('QuestionId[1]', 'int') AS  QuestionId,
    t.Col.value('Options[1]/string[1]', 'varchar(MAX)') Options 
FROM 
    @questions.nodes ('//Question') t(Col) 
WHERE 
    t.Col.value('QuestionId[1]', 'int') = 5

SELECT查询仅返回Options子字符串( Blue )的第一行。如何通过更改t.Col.value('Options[1]/string[1]', 'varchar(MAX)')将所有值设为4行(蓝色,红色,白色,黑色)?

SET @questions = '<?xml version="1.0" encoding="UTF-8"?>
    <Questions>
       <Question>
          <RowType>Question</RowType>
          <Required>False</Required>
          <QuestionText>select color</QuestionText>
          <QuestionType>Radio Buttons</QuestionType>
          <QuestionId>5</QuestionId>
          <Options>
             <string>Blue</string>
             <string>Red</string>
             <string>White</string>
             <string>Black</string>
          </Options>
       </Question>
       <Question>
          <RowType>Question</RowType>
          <Required>False</Required>
          <QuestionText>select color</QuestionText>
          <QuestionType>Radio Buttons</QuestionType>
          <QuestionId>6</QuestionId>
          <Options />
       </Question>
    </Questions>'

2 个答案:

答案 0 :(得分:2)

您需要string

apply

答案 1 :(得分:1)

您可以使用<string>向下转到Questions/Question/Options/string代码级别,然后返回一级获取QuestionId

SELECT 
    t.col.value('(//QuestionId)[1]','int') AS QuestionId,
    t.Col.value('(.)[1]' ,'varchar(50)')   AS Options 
FROM @questions.nodes ('Questions/Question/Options/string') t(Col) 
WHERE t.Col.value('(//QuestionId)[1]', 'int') = 5

结果:

enter image description here

正如评论中所指出的,当另一个<question>标记出现在必须选择的标记之前时,上述解决方案将无效。

这是包含4个<question>标记的新输入方案:

<?xml version="1.0" encoding="UTF-8"?>
<Questions>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>6</QuestionId>
        <Options />
    </Question>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>5</QuestionId>
        <Options>
            <string>Blue</string>
            <string>Red</string>
            <string>White</string>
            <string>Black</string>
        </Options>
    </Question>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>7</QuestionId>
        <Options />
    </Question>
    <Question>
        <RowType>Question</RowType>
        <Required>False</Required>
        <QuestionText>select color</QuestionText>
        <QuestionType>Radio Buttons</QuestionType>
        <QuestionId>8</QuestionId>
        <Options>
            <string>Blue</string>
            <string>Red</string>
            <string>White</string>
            <string>Black</string>
        </Options>
    </Question>
</Questions>

使用以下查询:

SELECT 
    t.col.value('((.)/QuestionId)[1]','int') AS QuestionId,
    u.Col.value('(.)[1]' ,'varchar(50)')     AS Options 
FROM @questions.nodes ('Questions/*')    t(Col) 
    OUTER APPLY t.Col.nodes('Options/*') u(Col)

结果如下:

enter image description here

应用where子句会产生预期的结果:

enter image description here