你想你的问题减少到必要的,这是伟大的,但我必须承认,我不完全理解这个......我必须承认,我不喜欢实体 - 值对我怀疑,这种结构会使你快乐......
我的理解是你的问题:...被放置在选择所有变量CUSTOM_DATA_ITEM下兄弟节点
有一个简单的伎俩:在它们之间放置一个空的节点。这将告诉引擎完成当前元素并开始新元素。
以下是一些建议:
DECLARE @tbl TABLE ([Name] VARCHAR(100),[Address] VARCHAR(100),SomeNumber INT);
INSERT INTO @tbl VALUES
('John','John''s street',100)
,('Steve','Steve''s street',300);
SELECT 'Name' AS [CUSTOM_DATA_ITEM/DataItemName]
,[Name] AS [CUSTOM_DATA_ITEM/DataItemValue]
,''
,'Address' AS [CUSTOM_DATA_ITEM/DataItemName]
,[Address] AS [CUSTOM_DATA_ITEM/DataItemValue]
,''
,'SomeNumber' AS [CUSTOM_DATA_ITEM/DataItemName]
,SomeNumber AS [CUSTOM_DATA_ITEM/DataItemValue]
FROM @tbl
FOR XML PATH('DataRow'),ROOT('EXTENSION')
结果
<EXTENSION>
<DataRow>
<CUSTOM_DATA_ITEM>
<DataItemName>Name</DataItemName>
<DataItemValue>John</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>Address</DataItemName>
<DataItemValue>John's street</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>SomeNumber</DataItemName>
<DataItemValue>100</DataItemValue>
</CUSTOM_DATA_ITEM>
</DataRow>
<DataRow>
<CUSTOM_DATA_ITEM>
<DataItemName>Name</DataItemName>
<DataItemValue>Steve</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>Address</DataItemName>
<DataItemValue>Steve's street</DataItemValue>
</CUSTOM_DATA_ITEM>
<CUSTOM_DATA_ITEM>
<DataItemName>SomeNumber</DataItemName>
<DataItemValue>300</DataItemValue>
</CUSTOM_DATA_ITEM>
</DataRow>
</EXTENSION>
我宁愿把内容属性为元素,但是这是一个品味问题:
SELECT 'Name' AS [CUSTOM_DATA_ITEM/@DataItemName]
,[Name] AS [CUSTOM_DATA_ITEM/@DataItemValue]
,''
,'Address' AS [CUSTOM_DATA_ITEM/@DataItemName]
,[Address] AS [CUSTOM_DATA_ITEM/@DataItemValue]
,''
,'SomeNumber' AS [CUSTOM_DATA_ITEM/@DataItemName]
,SomeNumber AS [CUSTOM_DATA_ITEM/@DataItemValue]
FROM @tbl
FOR XML PATH('DataRow'),ROOT('EXTENSION')
结果
<EXTENSION>
<DataRow>
<CUSTOM_DATA_ITEM DataItemName="Name" DataItemValue="John" />
<CUSTOM_DATA_ITEM DataItemName="Address" DataItemValue="John's street" />
<CUSTOM_DATA_ITEM DataItemName="SomeNumber" DataItemValue="100" />
</DataRow>
<DataRow>
<CUSTOM_DATA_ITEM DataItemName="Name" DataItemValue="Steve" />
<CUSTOM_DATA_ITEM DataItemName="Address" DataItemValue="Steve's street" />
<CUSTOM_DATA_ITEM DataItemName="SomeNumber" DataItemValue="300" />
</DataRow>
</EXTENSION>
但是 - 说实话 - 我不会这么做的。我把这个进退两难的结构:
SELECT [Name]
,[Address]
,SomeNumber
FROM @tbl
FOR XML PATH('DataRow'),ROOT('EXTENSION')
结果
<EXTENSION>
<DataRow>
<Name>John</Name>
<Address>John's street</Address>
<SomeNumber>100</SomeNumber>
</DataRow>
<DataRow>
<Name>Steve</Name>
<Address>Steve's street</Address>
<SomeNumber>300</SomeNumber>
</DataRow>
</EXTENSION>
我喜欢你的第一个建议。我不知道你可以这样做。然而,由于我有很多表格和名称,它会变得非常混乱和混乱,很难区分哪一列与选择对应。你知道我可以有一个循环来解决这个问题吗? – DRockClimber
嗨@DRockClimber,很高兴你喜欢它!因为你是新来的,请允许我提一个提示:关于SO的一个原则是:*一个问题,一个问题*。在这里你的问题是:*我怎样才能获得的元素分离,并不是所有的内父元素*您新的问题似乎是这样的:?*?我怎样才能得到一个表作为键 - 值对的XML元素一般*请创建一个(减少到最小!)示例数据和预期输出。新问题引起更多关注,您将很快得到帮助!在这里放置一个链接,我也会在那里弹出。 – Shnugo