我有一个为我生成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>
我正在努力争取在正确的领域发表声明。对我可能缺少的任何帮助?
答案 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');
这给出了这个结果:
<?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>