2015-11-04 20 views
0

我试图通过SQL为负载测试生成一些XML,但我在正确构建XML时遇到了问题。这是我有:SQL中的XML:当使用表列而不是字符串时,元素值的计算方式不同

-- Generate XML from table 
SELECT id AS '@id', 
action AS '@action', 
actionTime AS '@actionTime', 
firstName AS '@firstName', 
lastName AS '@lastName', 
email AS '@email', 
    (SELECT isActive AS '@isActive', 
    actionTime AS '@actionTime', 
    displayName AS '@displayName', 
    identifierId 
FOR XML PATH('identifier'), TYPE 
) 
FROM scratch.dbo.Identities 
FOR XML PATH('user'), ROOT('Users') 

这会生成XML,看起来像这样:

<Users> 
    <user id="QALoadTest1" action="add" actionTime="2015-11-01T00:00:00" firstName="Load" lastName="Test1" email="[email protected]"> 
    <identifier isActive="1" actionTime="2015-11-01T00:00:00" displayName="Load Test 1"> 
     <identifierId>1111111111</identifierId> 
     </identifier> 
    </user> 
</Users> 

如果我传递一个字符串作为标识符值,正确生成XML:

SELECT id AS '@id', 
action AS '@action', 
actionTime AS '@actionTime', 
firstName AS '@firstName', 
lastName AS '@lastName', 
email AS '@email', 
    (SELECT isActive AS '@isActive', 
    actionTime AS '@actionTime', 
    displayName AS '@displayName', 
    '11111111111' 
FOR XML PATH('identifier'), TYPE 
) 
FROM scratch.dbo.Identities 
FOR XML PATH('user'), ROOT('Users') 

这将生成以下,这正是我想要的:

<Users> 
    <user id="QALoadTest1" action="add" actionTime="2015-11-01T00:00:00" firstName="Load" lastName="Test1" email="[email protected]"> 
    <identifier isActive="1" actionTime="2015-11-01T00:00:00" displayName="Load Test 1">11111111111</identifierId> 
    </user> 
</Users> 

在这里使用列值和字符串有什么区别?有趣的是,当我将列值换成单引号(''' + identifierId + ''')时,它会生成正确结构的XML,但带有额外的引号(...displayName="Load Test 1">'11111111111'</identifierId>

回答

0

您的硬编码值不会自动生成列名称;列选择不(看看SELECT identifierId from IdentitiesSELECT '11111111111' from Identities的结果的标题中的差异。)

试着告诉它,你特别想在一个文本节点,而不是一列衍生名您的数据:

-- Generate XML from table 
SELECT id AS '@id', 
action AS '@action', 
actionTime AS '@actionTime', 
firstName AS '@firstName', 
lastName AS '@lastName', 
email AS '@email', 
    (SELECT isActive AS '@isActive', 
    actionTime AS '@actionTime', 
    displayName AS '@displayName', 
    identifierId AS 'text()' 
FOR XML PATH('identifier'), TYPE 
) 
FROM scratch.dbo.Identities 
FOR XML PATH('user'), ROOT('Users') 
+0

太棒了,谢谢!工作就像一个魅力:) –

相关问题