Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Странное поведение XML PATH  [new]
XML_question
Guest
Добрый день!

У меня возник вопрос по поведению XML PATH.
Есть запрос, который должен сформировать XML на основе таблицы.
При написание запроса столкнулся с очень странным поведением. По разному формирует теги, в зависимости от условия.

Вот тестовые данные
+
if object_id('tempdb..#t') is not null
begin
    drop table #t;
end;


Create table #t
(ID int identity(1,1)
 ,Attribute_A varchar(10) null
 ,Attribute_B varchar(9) null
 ,Attribute_C varchar(12) null
 ,Attribute_Type varchar(1) null)


 insert into #t( Attribute_A 
				 ,Attribute_B 
				 ,Attribute_C 
				 ,Attribute_Type)
	select	'Attr_A', 'Attr_B', 'Attr_C', 'F' 
union all
	select	'Attr_A_1', 'Attr_B_1', 'Attr_C_1', 'H' 


Я пишу запрос на формирование. Он выдает мне XML в правильном формате, в том, который мне нужен. А именно кусок
 <Attr_AB AT_A="Attr_A" AT_B="Attr_B"></Attr_AB>

Вот сам код формирования:
+
select	top(1) 	
		(select IIF(1=1, (	select	isnull(BBA.Attribute_A, '') as "@AT_A"
									,isnull(BBA.Attribute_B, '') as "@AT_B"
									,''
							from	#t BBA
							where	BB.ID = BBA.ID
							for XML PATH('Attr_AB'), TYPE),(	select	isnull(BBA.Attribute_C, '') as "@AT_C"
																	,''
															from	#t BBA
															where	BB.ID = BBA.ID
															for XML PATH('Attr_C'), TYPE)))	as "Attr"									
						
from	#t BB
for XML PATH('Root'), TYPE



Все хорошо, поведение то, что я и хочу. Но мне нужно иное условие, на основе атрибута из сущности. Я его добавляю в запрос, и он меняет саму структуру XML. Нужный мне кусок теперь отображается по иному, а именно
<Attr_AB AT_A="Attr_A" AT_B="Attr_B" />

Вот код запроса:
+
select	top(1) 	
		(select IIF(BB.Attribute_Type = 'F', (	select	isnull(BBA.Attribute_A, '') as "@AT_A"
														,isnull(BBA.Attribute_B, '') as "@AT_B"
														,''
												from	#t BBA
												where	BB.ID = BBA.ID
												for XML PATH('Attr_AB'), TYPE),(	select	isnull(BBA.Attribute_C, '') as "@AT_C"
																						,''
																				from	#t BBA
																				where	BB.ID = BBA.ID
																				for XML PATH('Attr_C'), TYPE)))	as "Attr"									
						
from	#t BB
for XML PATH('Root'), TYPE



И вот здесь я вообще не понимаю, почему так происходит. Я пробовал переписывать через case, но результат все равно тот же.
Просьба помочь в решение данной проблемы.

Версия сервера
+
Microsoft SQL Server 2014 - 12.0.2000.8 (X64) 
	Feb 20 2014 20:04:26 
	Copyright (c) Microsoft Corporation
	Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
17 мар 15, 11:15    [17393532]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение XML PATH  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
c точки зрения структуры это равнозначный код
<Attr_AB AT_A="Attr_A" AT_B="Attr_B"></Attr_AB>

и
<Attr_AB AT_A="Attr_A" AT_B="Attr_B" />
17 мар 15, 11:30    [17393614]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение XML PATH  [new]
XML_question
Guest
LexusR,
А есть ли способ прийти именно к такому отображению. И почему тогда меняется отображение?
<Attr_AB AT_A="Attr_A" AT_B="Attr_B"></Attr_AB>
17 мар 15, 11:54    [17393776]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение XML PATH  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
так попробуй хотя смысла не вижу
SELECT 
 case when BB.Attribute_Type = 'F' then isnull(BB.Attribute_A, '') else null end as "Attr_AB/@AT_A"
,case when BB.Attribute_Type = 'F' then isnull(BB.Attribute_B, '')  else null end as "Attr_AB/@AT_B"
,case when BB.Attribute_Type = 'F' then '' else null end as Attr_AB
,case when BB.Attribute_Type <> 'F' then isnull(BB.Attribute_C, '') else null end as "Attr_C/@AT_C"
,case when BB.Attribute_Type <> 'F' then '' else null end as Attr_C
FROM	#t BB
FOR XML PATH('Attr'),Root('Root'), TYPE
17 мар 15, 12:49    [17394148]     Ответить | Цитировать Сообщить модератору
 Re: Странное поведение XML PATH  [new]
XML_question
Guest
LexusR, спасибо большое.
Согласен смысла уже не было, просто уже было интересно как уйти от этого.
17 мар 15, 13:19    [17394359]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить