2016-07-13 47 views
1

我有一个返回使用多个表的XML以下SQL功能。这里的问题是,该路径被放置在SELECT所有变量导出到XML时CUSTOM_DATA_ITEM下兄弟节点。计数的函数变量的数量

ALTER FUNCTION [dbo].[GetXML] 
(
@Id UNIQUEIDENTIFIER 
) 
RETURNS XML 
     AS 
BEGIN 
RETURN (
    SELECT 
    (
     SELECT 
     [Address] = [Property].[Address], 
     [Name] = [Person].[Name] 
     ... 
     FOR XML PATH('CUSTOM_DATA_ITEM'), ROOT('CUSTOM_DATA_ITEMS'), TYPE 
    ) 
    FROM [Property] LEFT JOIN 
     [Person] ON [Person].[ID] = [Property].[ID] 
    WHERE ([Property].[ID] = @Id) 
    FOR XML PATH('OTHER'), ROOT('EXTENSION'), TYPE 
); 

我想返回的XML每个变量的,看起来像这样:

<CUSTOM_DATA_ITEM> 
    <DataItemName>Address</DataItemName> (variable name) 
    <DataItemValue>AddressValue</DataItemValue> (value inside table column) 
</CUSTOM_DATA_ITEM> 
<CUSTOM_DATA_ITEM> 
    <DataItemName>Name</DataItemName> 
    <DataItemValue>NameValue</DataItemValue> 
</CUSTOM_DATA_ITEM> 

我想这些变量与[cte]然后做COUNT([cte].[*])周边的,但似乎没有不工作。从那里我想有一个while循环,并坚持每个变量的路径。

我目前的解决方案是有这样的事情,但我会为每一个变量做到这一点。

SELECT [DataItemName] = CASE WHEN [Property].[Address] IS NOT NULL THEN 'Address' END, 
     [DataItemValue] = [Property].[Address] 
FOR XML PATH('CUSTOM_DATA_ITEM'), TYPE), 

回答

0

你想你的问题减少到必要的,这是伟大的,但我必须承认,我不完全理解这个......我必须承认,我不喜欢实体 - 值对我怀疑,这种结构会使你快乐......

我的理解是你的问题:...被放置在选择所有变量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> 
+0

我喜欢你的第一个建议。我不知道你可以这样做。然而,由于我有很多表格和名称,它会变得非常混乱和混乱,很难区分哪一列与选择对应。你知道我可以有一个循环来解决这个问题吗? – DRockClimber

+0

嗨@DRockClimber,很高兴你喜欢它!因为你是新来的,请允许我提一个提示:关于SO的一个原则是:*一个问题,一个问题*。在这里你的问题是:*我怎样才能获得的元素分离,并不是所有的内父元素*您新的问题似乎是这样的:?*?我怎样才能得到一个表作为键 - 值对的XML元素一般*请创建一个(减少到最小!)示例数据和预期输出。新问题引起更多关注,您将很快得到帮助!在这里放置一个链接,我也会在那里弹出。 – Shnugo