Задать вопрос
@sanReal
закипающий чайник

Как выбрать данные в таблицу из “select for xml raw”?

select for xml raw выбирает данные в формате атрибут: значение

Как выбрать данные обратно в таблицу, если названия атрибутов заранее не известны?
  • Вопрос задан
  • 180 просмотров
Подписаться 1 Оценить 2 комментария
Решения вопроса 1
@sanReal Автор вопроса
закипающий чайник
В итоге решил с помощью динамического SQL.
declare 
@colNames TABLE(
  id INT IDENTITY,
  colName nvarchar(max)
);
declare @XMLVal XML;
set @XMLVal = '<row link="someLink" DATASOURCE="SomeSystem" obj_id="1" err_id="1" />
<row link="someLink" DATASOURCE="SomeSystem" obj_id="1" err_id="2" />';
-----DEFINE COLUMN NAMES-------------
insert into @colNames
select distinct
       t.c.value('local-name(.)', 'nvarchar(128)') as [ID]
from @XMLVal.nodes('row/@*') as t(c) 
-----COUNT COLUMNS QNTY---------------------
DECLARE @MaxCount INT;
SELECT @MaxCount = count(*) from @colNames
-----GENERATE SQL---------------------------
DECLARE @SQL NVARCHAR(max), @i INT, @curentColumnName nvarchar(max);
SET @i = 0;
SET @SQL = 'declare @XMLVal XML;
SET @XMLVal = ''<row link="someLink" DATASOURCE="SomeSystem" obj_id="1" err_id="1" />
<row link="someLink" DATASOURCE="SomeSystem" obj_id="1" err_id="2" />'';
select ';
WHILE @i < @MaxCount
BEGIN
   SET @i = @i + 1;
     select @curentColumnName = colName from @colNames where id = @i;
     SET @SQL = @SQL + ' t.c.value(''@' + @curentColumnName + ''', ''nvarchar(128)'') as ' + @curentColumnName;
    if (@i < @MaxCount ) begin
       SET @SQL = @SQL + ', ';
    end 
 END
 SET @SQL = @SQL + ' from @XMLVal.nodes(''/row'') as t(c)'; 
 EXEC sp_executesql @SQL;
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы