Как извлечь оператор выбора в поле таблицы в виде XML - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь реплицировать кусок кода SQL, который работает на базе данных Oracle, для работы также в SQL Server. По сути, мне нужно выбрать определенные столбцы (определенные) из нескольких таблиц в одну таблицу - это как объединение только с переменным количеством таблиц. Точные имена таблиц не определены, поэтому в Oracle я использую user_tables, такие как '% ABC%', чтобы получить список всех таблиц, и dbms_xmlgen.getxmltype для выполнения созданного оператора select.

В Oracle у меня работает следующий код ...

select table_name,                  
   dbms_xmlgen.getxmltype('select id,name from '|| table_name).extract('/*') rec
from user_tables
where table_name like '%ABC%';

Я знаю, что мог бы создать переменную и выполнить ее в таблицу, но мне нужно, чтобы это был оператор SELECT так же, как кусок оракула. Возможно ли что-то подобное в SQL Server?

ОБНОВЛЕНИЕ: я хотел бы, чтобы 'выполненный' результат универсального оператора SQL => вывод имел два столбца, table_name в качестве первого столбца, а второй столбец (REC) содержит блок XML результата выбора для каждой таблицы.

Требуемый выходной образец

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Если вы хотите получить содержимое ваших таблиц в виде XML, вам нужно сгенерировать динамический SQL и выполнить этот оператор. Используйте информацию из sys.objects представления системного каталога (как предложил @AndreyNikolov) и извлекайте содержимое каждой таблицы с помощью предложения FOR XML .

-- Declarations
DECLARE 
    @stm nvarchar(max),
    @err int

-- Statement generation
SET @stm = N''
SELECT @stm = @stm +
        N' UNION ALL ' +
        N'SELECT ' +
        N'''' +
        [name] + 
        N''' AS [Table], ' +
        N'(SELECT [id], [name] FROM '+
        + [name] +
        N' FOR XML RAW, ELEMENTS, TYPE, ROOT(''ROWSET'')) AS [Rec]'
FROM sys.objects
WHERE 
    ([type] = 'U') AND
    ([name] LIKE '%ABC%')
SET @stm = STUFF(@stm, 1, 10, N'')

-- Execution
PRINT @stm
EXEC @err = sp_executesql @stm
IF @err = 0 
    PRINT 'OK'
ELSE 
    PRINT 'Error'
0 голосов
/ 07 января 2019

Вы можете получить список таблиц, выбрав из sys.objects динамическое представление управления, где type столбец равен U (то есть пользовательская таблица):

select name as TableName, 'select id, objectname, description from ' + name as SelectStatement
from sys.objects o
where o.type = 'U'
  and o.name like '%ABC%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...