SQL Создание столбцов/данных на основе xml

У меня есть xml:


    
        Pants
        No
    
    
        Other
        Yes
    



    
        Pants
        Yes
    
    
        Other
        Yes
    



    
        a
        b
    
    
        c
        d
    

each root element is stored in a column in a sql server database, and I need to create the columns/rows based on it. I'd like the "Name" as the column name and the values populated for that column. There also may not always be 2 elements, there could be more or less.

Поэтому, когда все вышеизложенное возникает, я хочу:

|other columns|Pants|Other|a|c|<-column names
|~~~~~~~~~~~~~|No   |Yes  | | |<-rows
|~~~~~~~~~~~~~|Yes  |Yes  | | |
|~~~~~~~~~~~~~|     |     |b|d|

Возможно ли это?

0
nl ja de

2 ответы

При динамическом количестве столбцов вам нужен динамический SQL.

Начните с заполнения временной таблицы с помощью интересующего вас списка Name/Value. Затем создайте динамическую инструкцию SQL из таблицы temp и выполните динамический запрос.

select ID,
       X.N.value('(Name/text())[1]', 'varchar(max)') as Name,
       X.N.value('(Value/text())[1]', 'varchar(max)') as Value
into #T
from T
  cross apply T.XMLCol.nodes('root/item') as X(N)

declare @SQL nvarchar(max)
declare @Col nvarchar(max)

select @Col = 
  (
  select distinct ','+quotename(Name)
  from #T
  for xml path(''), type
  ).value('substring(text()[1], 2)', 'nvarchar(max)')

set @SQL = 'select ID,'[email protected]+'
            from #T
            pivot (max(Value) for Name in ('[email protected]+')) as P'

exec (@SQL)

drop table #T

SQL Fiddle

1
добавлено
SELECT 
   XMLColumnName.value('(/root/item/Name)[1]','varchar(max)') AS firstname,
   XMLColumnName.value('(/root/item/Value)[1]','varchar(max)') AS myValue

FROM MyTable

Not sure why you're using the '' tag as you are (usually there is just one begging and ending tag for the entire xml value). Might not make a difference, but you'll have to see.

1
добавлено
@Shawn - получил это - я думал, что у вас есть несколько корней в одной записи по какой-то причине - моя ошибка.
добавлено автор Chains, источник
О каком теге вы говорите? Если вы имеете в виду несколько корневых элементов, каждый корневой раздел хранится в другой строке базы данных.
добавлено автор Shawn, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)