TSQL格式查询输出

时间:2013-12-20 05:33:55

标签: sql sql-server tsql

我有一个为我生成XML输出的存储过程。

SP看起来像这样:

ALTER PROCEDURE [dbo].[InternFetchProf]
@positionID INT=''
AS
BEGIN
SET NOCOUNT ON;
BEGIN
    SELECT   A.[id],
             A.[positionTitle],
             (SELECT   B.[id],
                       B.[question],
                       B.[order],
                       (SELECT   D.[optionName],
                                 D.[order]
                        FROM     internshipProfOptions AS D
                        WHERE    questionID = B.[id]
                        ORDER BY D.[order] ASC
                        FOR      XML PATH ('optionsBlock'), TYPE, ELEMENTS, ROOT ('options'))
              FROM     internshipProfQuestions AS B
              WHERE    positionID = A.[id]
              ORDER BY B.[order] ASC
              FOR      XML PATH ('questionBlock'), TYPE, ELEMENTS, ROOT ('questions'))
    FROM     internships AS a
    WHERE    A.[id] = @positionID
    ORDER BY closeDate ASC
    FOR      XML PATH ('positions'), TYPE, ELEMENTS, ROOT ('root');
END
END

这给了我

的XML输出
                      <root>
              <positions>
                <id>1</id>
                <positionTitle>APS Team</positionTitle>
                <questions>
                  <questionBlock>
                    <id>1</id>
                    <question>Whats your fav color</question>
                    <order>1</order>
                    <options>
                      <optionsBlock>
                        <optionName>VBA</optionName>
                        <order>1</order>
                      </optionsBlock>
                      <optionsBlock>
                        <optionName>JavaScript</optionName>
                        <order>2</order>
                      </optionsBlock>
                      <optionsBlock>
                        <optionName>HTML</optionName>
                        <order>3</order>
                      </optionsBlock>
                    </options>
                  </questionBlock>
                  <questionBlock>
                    <id>2</id>
                    <question>Whos your daddy?</question>
                    <order>2</order>
                    <options>
                      <optionsBlock>
                        <optionName>PHP</optionName>
                        <order>1</order>
                      </optionsBlock>
                      <optionsBlock>
                        <optionName>Perl</optionName>
                        <order>2</order>
                      </optionsBlock>
                    </options>
                  </questionBlock>
                </questions>
              </positions>
            </root>

我在这里有一个额外的SELECT语句:

SELECT C.[groupName],
                             C.[order],
                       FROM   internshipProfGroups AS C
                      WHERE  questionID = B.[id]
                      FOR    XML PATH ('groupBlock'), TYPE, ELEMENTS, ROOT ('groups')

我试图在“QuestionBlock”的根目录中生成XML,如下所示:

            <questionBlock>
            ...

            <groups>
               <groupBlock>
                  <groupName>Testing</groupName>
               </groupBlock>
               <groupBlock>
                  <groupName>Another Test</groupName>
               </groupBlock>
            </groups>

            ...
            </questionBlock>

我正在努力争取在正确的领域发表声明。对我可能缺少的任何帮助?

1 个答案:

答案 0 :(得分:1)

如果我理解你需要在“SELECT D. [OptionName]”的同一级别插入第二个查询(我认为你在代码中也有一些错误):

SELECT  
   A.[id],
   A.[positionTitle],
   (SELECT   B.[id],
             B.[question],
             B.[ord],
            (SELECT   D.[optionName],
                      D.[ord]
             FROM     internshipProfOptions AS D
             WHERE    questionID = B.[id]
             ORDER BY D.[ord] ASC
             FOR      XML PATH ('optionsBlock'), TYPE, ELEMENTS, ROOT ('options')),
            (SELECT C.[groupName],
                       C.[ord]
             FROM   internshipProfGroups AS C
             WHERE  questionID = B.[id]
             FOR    XML PATH ('groupBlock'), TYPE, ELEMENTS, ROOT ('groups'))
    FROM     internshipProfQuestions AS B
    WHERE    positionID = A.[id]
    ORDER BY B.[ord] ASC
    FOR      XML PATH ('questionBlock'), TYPE, ELEMENTS, ROOT ('questions'))
FROM internships A
WHERE    A.[id] = 3
ORDER BY closeDate ASC
FOR      XML PATH ('positions'), TYPE, ELEMENTS, ROOT ('root'); 

WORKING SAMPLE

这给出了这个结果:

<?xml version="1.0"?>
<root>
    <positions>
        <id>3</id>
        <positionTitle>Trimepost</positionTitle>
        <questions>
            <questionBlock>
                <id>2</id>
                <question>What?</question>
                <ord>1</ord>
                <options>
                    <optionsBlock>
                        <optionName>Opt 2</optionName>
                        <ord>3</ord>
                    </optionsBlock>
                </options>
                <groups>
                    <groupBlock>
                        <groupName>ALPHA</groupName>
                        <ord>1</ord>
                    </groupBlock>
                    <groupBlock>
                        <groupName>BETA</groupName>
                        <ord>2</ord>
                    </groupBlock>
                </groups>
            </questionBlock>
        </questions>
    </positions>
</root>