2015-05-15 40 views
0

我已經瀏覽了幾個關於使用FOR XML的SO問題,但沒有找到任何特定於我的查詢的內容。Sql ForXml;連接字段返回逗號分隔列表或空字符串

幸運的是,我需要提交數據的服務需要我的表中的字段作爲屬性而不是元素提交,這意味着我可以使用FOR XML AUTO。然而,它確實需要一些我不確定如何編寫正確的sql來實現的東西,爲此我歡迎一些建議。

某些字段(假設我有三個名爲Log1,Log2和Log3)需要返回作爲參數調用Logs的一個屬性。如果所有三個日誌字段都是Null,那麼它需要是一個空字符串,或者如果它們包含數據,則它們需要與逗號作爲分隔符連接。我懷疑一個簡單的Coalesce並不是這裏的答案,但我不完全確定還有什麼可以做的。

正如我所說,我會歡迎一些建議。謝謝。

編輯

道歉,應該添加一些sql來協助。

SELECT LandingId, 
    VesselId, 
    TicketNumber, 
    CONVERT(VARCHAR(10),LandingDate1,112) AS landingdate1, 
    Log1, 
    Log2, 
    Log3, 
    COALESCE(VesselName,'') AS vesselName, 
    VesselOwner 
FROM Landings.LandingHeaders AS sale FOR XML AUTO 

LOG1,LOG2和LOG3應該成爲日誌,是一個空字符串,如果所有都爲空或逗號分隔的列表,如果它們包含的數據。

EDIT2(電流輸出與VesselName和所有者移除保護機密)

<sale LandingId="3388" VesselId="1" TicketNumber="1   " landingdate1="20130705" /> 

屁股登錄值都爲空什麼都沒有回來,不知道我是否可以使用聚結的形式要麼產生空字符串,要麼產生逗號分隔列表。 我知道我需要修改ticketNumber。

+1

如果您添加一些示例數據,您現在使用的查詢和預期結果我們將能夠更好地幫助您 –

+1

如果您將提供所需的xml結構以及sql方案和某些查詢嘗試 - 建議一些東西會容易得多。現在你的問題沒有太多可讀性和清晰度。 –

+0

已經添加了sql,我很抱歉沒有這麼做過。 –

回答

1

最好不要使用for xml auto,而要使用for xml path,因爲它給了你更多的靈活性。

你的預期目標(如果我理解正確的話),可以這樣實現(我已經跳過某些字段)

select 
    VesselId as '@VesselId', 
    TicketNumber as '@TicketNumber', 
    isnull(Log1 + ',', '') + isnull(Log2 + ',', '') + isnull(Log3 + ',', '') as '@Log123' 
from Landings.LandingHeaders for xml path('sale') 

更新

坦率地說,你可以具體情況achive使用for xml auto你的目標也一樣,拼接領域的核心思想像

isnull(Log1 + ',', '') + isnull(Log2 + ',', '') + isnull(Log3 + ',', '') 

得到空〜應變g如果所有三個字段都是空值且非空字符串與某些數據保持相同。

+0

非常感謝Andy,真是太棒了。我想到了; COALESCE('',RTRIM(Log1),',',RTRIM(Log2),',',RTRIM(Log3)),'')AS日誌可以工作,但您的解決方案更簡潔。 FOR XML非常新,那麼Path over AUTO有什麼好處呢? –

+0

@DomSinclair正如我所說 - '路徑'給你比'auto'更多的靈活性。你可以看看我的另一個[答案](http://stackoverflow.com/questions/29259623/query-results-same-when-using-xml-raw-element-and-xml-path/29260055#29260055)我已經提供了一些關於它的細節。 –

+0

謝謝安迪,+1爲你的其他答案,因爲它很好地解釋它。 –

相關問題