2016-07-13 46 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