2015-10-06 64 views
1

我有SQL,需要將起始和結束XML標記呈現爲<PropName></PropName>而不是<PropName />值爲NULL時。如何獲得SQL以生成起始XML標記和結束XML標記

我知道這不是標準,但我有這樣做的商業理由。我嘗試了​​聲明的幾個變體,但似乎無法將其渲染爲<PropName></PropName>

select [PropName] as '*' for xml path(''), type) as [PropName] 

呈現<PropName />我如何改變它呈現爲<PropName></PropName>

+0

使用sigle incline quote來指示代碼'\'' –

+2

''和''是100%的同一件事情。除非**用於處理XML的工具不合適或不合適,否則不必使用其中一種**。在這種情況下,你必須修復你的工具,而不是你的XML。 – Tomalak

+0

@Tomalak OP已經解決了這個問題'我知道這不是標準,但我有一個商業原因' –

回答

1

感謝大家的反饋。我知道,「<」PropName「>」「<」/ PropName「>」和「<」PropName /「>」是100%的同一件事,我明白了,任何需要它的人都應該在它們的最後修復它。生成的文件被髮送到第三方供應商,他們堅持將其呈現爲。幸運的是,一個同事發現我只需要在我的外部SELECT語句的末尾放置「,TYPE」,而不是放在PropName所在的子選擇中,並且照顧它 - 誰會猜到?我想我應該提到我的PropName是在一個子選擇中;也許這會對答案有所幫助。

1

您已經找到了您的解決方案。只是爲了弄清楚這一點...

所有的聲明,如「改變讀者,而不是XML」,當然是正確的。但有時我們必須滿足我們無法改變的第三方要求。

有一些技巧來處理生成空的XML元素。將其粘貼到空的查詢窗口中並執行。檢查結果...

--The NULL-element is not there at all 
SELECT 'text' AS filled 
     ,'' AS empty 
     ,NULL AS NotThere 
FOR XML PATH('row'); 

--The NULL-element is rendered using "nil" 
SELECT 'text' AS filled 
     ,'' AS empty 
     ,NULL AS NotThere 
FOR XML PATH('row'),ELEMENTS XSINIL  

--Look at this: Both columns are called "TheName". They are implicitly concatenated 
SELECT 'a' AS TheName 
     ,'b' AS TheName 
FOR XML PATH('row') 

--That leads to: Concatenate nothing with an empty string will at least return the empty string. 
--this is other/better than ISNULL, because it will work with any type... 
SELECT NULL AS TheName 
     ,'' AS TheName 
FOR XML PATH('row') 

DECLARE @tbl TABLE(int1 INT, int2 INT); 
INSERT INTO @tbl VALUES(NULL,1); 

--int1 is missing 
SELECT * 
FROM @tbl 
FOR XML PATH('row'); 

--both elements are there 
SELECT int1, '' AS int1 --ISNULL(int1,'') would not compile... 
     ,int2, '' AS int2 
FROM @tbl 
FOR XML PATH('row'); 

最後:如果你真的需要這樣的轉換,你可以創建XML,它轉換爲VARCHAR,並使用Replace改變所有<PropName /><PropName></PropName>。我現在必須洗手;-)

+0

感謝您的XML技巧!我會把他們放在安全的地方供將來參考。 – Steve

+0

@Steve,Thx您的評論。只是看到有一個最後的'FOR XML PATH'丟失了。所以最後一個例子沒有正確顯示。對不起...你可能自己找到了這個。如果你喜歡這個答案,請投票並 - 如果你願意的話 - 接受標記(表決計數器下面的檢查)。所有在這裏給出答案的人都渴望聲望點:-) – Shnugo