2013-09-07 2 views
1

Три, казалось бы, идентичные запросы XML-узлов(), но первый возвращает другой результат для первой строки для столбцов: Location1, Location2, Location3
Почему это другое?
Спасибо заранее.SQL: узлы XML(): идентичные запросы: различный результат

declare @xml xml 
set @xml = 
'<root> 
    <Location1 LocationID="10"> 
    <step1>apple</step1> 
    <step2>banana</step2> 
    </Location1> 
    <Location2 LocationID="20"> 
    <step1>carrot</step1> 
    <step2>donut</step2> 
    </Location2> 
    <Location3 LocationID="30"> 
    <step1>egg</step1> 
    <step2>fry</step2> 
    </Location3> 
</root>' 

declare @SQL nvarchar(max) = '' 
declare @Col nvarchar(max) = ', N.value(''[COLNAME][1]'', ''varchar(100)'') as [COLNAME]' 
select @SQL = @SQL + replace(@Col, '[COLNAME]', N.value('local-name(.)', 'sysname')) 
from @XML.nodes('//*') as T(N) 
set @SQL = 'select '+stuff(@SQL, 1, 2, '')+' from @XML.nodes(''//*'') as T(N)' 
exec sp_executesql @SQL, N'@XML xml', @XML 

declare @sql2 nvarchar(max) = '' 
set @sql2 = 
'select 
n.value(''root[1]'',''varchar(100)'') as root, 
n.value(''location1[1]'',''varchar(100)'') as location1, 
n.value(''step1[1]'',''varchar(100)'') as step1, 
n.value(''step2[1]'',''varchar(100)'') as step2, 
n.value(''location2[1]'',''varchar(100)'') as location2, 
n.value(''step1[1]'',''varchar(100)'') as step1, 
n.value(''step2[1]'',''varchar(100)'') as step2, 
n.value(''location3[1]'',''varchar(100)'') as location3, 
n.value(''step1[1]'',''varchar(100)'') as step1, 
n.value(''step2[1]'',''varchar(100)'') as step2 
from @xml.nodes(''//*'') as t(n)' 
exec sp_executesql @SQL2, N'@XML xml', @XML 

select 
n.value('root[1]','varchar(100)') as root, 
n.value('location1[1]','varchar(100)') as location1, 
n.value('step1[1]','varchar(100)') as step1, 
n.value('step2[1]','varchar(100)') as step2, 
n.value('location2[1]','varchar(100)') as location2, 
n.value('step1[1]','varchar(100)') as step1, 
n.value('step2[1]','varchar(100)') as step2, 
n.value('location3[1]','varchar(100)') as location3, 
n.value('step1[1]','varchar(100)') as step1, 
n.value('step2[1]','varchar(100)') as step2 
from @xml.nodes('//*') as t(n) 

PS: ОК. Это не позволит мне опубликовать это, не написав больше, так что: В конечном счете, я пытаюсь заставить SQL проанализировать XML-файл в таблице с узлами, элементами и атрибутами в качестве заголовков столбцов с их соответствующими значениями или подносами, перечисленными ниже , Что-то вроде этого (я не мог получить изображение для загрузки, мы надеемся, верстку останется):

root  Location1  LocationID  Step1  Step2  Location2  Location3 
Location1 LocationID  10 
      Step1       apple 
      Step2          banana 
Location2    20         LocationID 
             carrot    Step1 
                donut  Step2 
Location3    30             LocationID 
             egg         Step1 
                fry      Step2 

По какой-то причине, это высокий заказ для SQL, но я до сих пор интересно, почему разница в приведенных выше запросов ,

ответ

0

Причина в том, что имена элементов xml чувствительны к регистру. В первом запросе у вас есть Location1, Location2, Location3, во втором location1, location2, location3

+0

ДУХ. Я должен был это заметить. Благодарю. – user2752528

Смежные вопросы