Sql ForXml; объединяющие поля, возвращающие либо разделенный запятыми список, либо пустую строку
Я просмотрел несколько SO вопросов по использованию FOR XML, но либо пропустил, либо не нашел ничего конкретного для моего запроса.
К счастью, или, возможно, нет, службе, в которую мне нужно отправлять данные, нужны поля из моих таблиц, представленные как атрибуты, а не элементы, что означает, что я могу использовать FOR XML AUTO. Однако это требует некоторых вещей, которые я не знаю, как написать правильный sql для достижения, и для которых я бы приветствовал некоторые советы.
Некоторые поля (скажем, у меня есть три с именами Log1, Log2 и Log3) должны быть возвращены как один атрибут, вызываемый для аргументов ради Logs. Если все три поля журнала имеют значение Null, то это должна быть пустая строка, или если они содержат данные, их необходимо объединить запятой в качестве разделителя. Я подозреваю, что простое объединение не является здесь ответом, но я не совсем уверен, что еще будет делать.
Как я уже сказал, я бы приветствовал некоторые предложения. Благодарю.
РЕДАКТИРОВАТЬ
Извинения, должен был добавить немного 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" />
Если значения Log равны нулю, ничего не возвращается. Не уверен, что я смогу использовать форму объединения для создания пустой строки или списка через запятую. Я знаю, что мне нужно урезать номер билета.
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')
Обновить
Честно говоря, в вашем конкретном случае вы можете достичь своей цели, используя for xml auto
тоже ключевая идея объединения полей, таких как
isnull(Log1 + ',', '') + isnull(Log2 + ',', '') + isnull(Log3 + ',', '')
получить пустую строку, если все три поля являются нулевыми, а непустая строка с некоторыми данными осталась прежней.