我正在构建一个动态的SQL查询,但我遇到了一个问题。我需要在此查询中创建子选择,并将结果作为XML输出,因为返回的值不止一个。
-- Open our primary select
SELECT @SQL = 'SELECT('
-- Begin the first sub select of primary fields
SELECT @SQL += 'SELECT '
-- Go through the primary fields temp table and print out the column names
SELECT @SQL += (
SELECT f.alias + ', '
FROM @primaryFields AS f
FOR XML PATH('')
)
-- Remove the trailing comma from the last field
SELECT @SQL = LEFT(@SQL, LEN(@SQL) -1) + ' '
-- Begin the select statement
SELECT @SQL += ' FROM View_BS_Render_Dashboard as db '
-- Create our WHERE Clause
SELECT @SQL += 'WHERE '
-- Test Data
SELECT @SQL += 'db.initiativeCreatorEmpID = @initCreator '
SELECT @SQL += 'FOR XML PATH(''primary''), ELEMENTS, ROOT(''primaryFields'')'
SELECT @SQL += ')'
-- Print the closing XML data
SELECT @SQL += 'FOR XML PATH(''data''), ELEMENTS, ROOT(''root'')'
-- Execute the SP
PRINT @SQL
EXEC sp_executesql @SQL, N'@initCreator varchar(12)', @initCreator='1234'
我遇到的问题是INNER FOR XML
。它导致所有字段打印为字符串而不是XML。
这是输出:
<root>
<data><primaryFields><primary><initiativeTitle>Test</initiativeTitle><initiativeDescriptionPreview>Test Desc</initiativeDescriptionPreview></data>
</root>
正如您所看到的,XML标记在外部选择上工作正常,但它不适用于内部选择。如果我注释掉外部并且只使用内部选择,则这些字段显示正常(作为xml)。
我在这里缺少什么?我将在主根/数据节点内总共有3-4个子选择,因此我需要能够嵌套XML。