Как я могу выбрать заголовки столбцов, возвращаемые оператором EXE C, во временную таблицу? - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь выбрать заголовки / имена столбцов из инструкции EXE C в SQL.

Например, если я запустил код

SET @ls_SQL = 'EXEC dbo.Generic_Proc ' + @Param
    EXEC(@ls_SQL)

, и он вернет:

|---------------------|------------------|
|      ColumnName1    |     ColumnName2  |
|---------------------|------------------|
|          12         |         34       |
|---------------------|------------------|

Как я могу получить строки «ColumnName1» и «ColumnName2» в временная таблица? Примерно так:

|---------------------|------------------|
|        Row          |       Header     |
|---------------------|------------------|
|          1          |    ColumnName1   |
|---------------------|------------------|
|          2          |    ColumnName2   |
|---------------------|------------------|

Я пробовал использовать sp_describe_first_result_set, но «Generic_Pro c» использует Dynami c SQL, поэтому я получаю сообщение об ошибке. В сообщении об ошибке указано, что я могу явно описать набор результатов, но, к сожалению, возвращаемые столбцы будут разными в зависимости от отправленного в него параметра. Есть ли способ обойти это?

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Я пытаюсь выбрать заголовки / имена столбцов из инструкции EXE C в SQL. . . [но] возвращаемые столбцы будут отличаться в зависимости от переданного ему параметра.

В T SQL нет первоклассного способа сделать это.

Вы можете сделать это в SQL CLR или путем введения Loopback Linked Server с оговоркой, что

*

Loopback-связанные серверы предназначены для тестирования и не поддерживаются для многих операции, такие как распределенные транзакции.

Связанные серверы

select *
into #foo
from openquery(Loopback,'select 1 a, 3 b')

select c.name, t.name type_name
from tempdb.sys.columns c
join tempdb.sys.types t
  on c.system_type_id = t.system_type_id
where object_id = object_id('tempdb..#foo')
0 голосов
/ 18 июня 2020

Я бы рекомендовал для этого использовать UNPIVOT. Чтобы выполнить динамическое отключение, я бы поместил результаты вашей хранимой процедуры во временную таблицу .

Тогда вот sql, который позаботится обо всем остальном:

SELECT  1 AS Column1, 2 AS Column2, 3 AS Column3, 4 AS Column4
INTO #Temp --Put your SP results here


DECLARE @columnsToUnpivot  AS NVARCHAR(MAX),
   @unpivotQuery  AS NVARCHAR(MAX)

SELECT @columnsToUnpivot 
  = STUFF((SELECT ','+QUOTENAME(name)
  FROM Tempdb.Sys.Columns Where Object_ID = Object_ID('tempdb..#Temp')
           for xml path('')), 1, 1, '')
SELECT @columnsToUnpivot
set @unpivotQuery 
  = ' SELECT
        *
    FROM
        #Temp AS t
     UNPIVOT
     (
        VALUE
        for Col in ('+ @columnsToUnpivot +')
     ) u'


exec sp_executesql @unpivotQuery;
DROP TABLE #Temp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...