¿Cómo saco las columnas de un store procedure dinámico en SQL Server?

Tengo la problemática de que requiero saber las columnas de cualquier store procedure que pase como parámetro dentro de otro. Pero en cualquier caso no obtengo ningún resultado.

ALTER PROCEDURE getColumnsTable
(
    @tableColumnsNames  nvarchar(45)
)
AS 

BEGIN 

DECLARE @TSQL varchar(100)



SET @TSQL = 'select * into #TablaTemporal FROM OPENQUERY( MyServerConnection,  ''EXEC '+   @tableColumnsNames    +''');' 

EXEC (@TSQL)

SELECT COLUMN_NAME 
FROM tempdb.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME like '%#TablaTemporal%'

IF EXISTS (SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS WHERE  TABLE_NAME  like  '%#TablaTemporal%' )
    BEGIN
    DROP TABLE #TablaTemporal
    END 


END

Este es el store procedure que quisiera leer

ALTER PROCEDURE MyProcTest AS 
BEGIN SET NOCOUNT ON; 
select c.idCliente,f.idFactura     
     from Cliente c inner join Factura f on (c.idCliente=f.idCliente)            
     where 1=2 
END

Quisiera obtener como resultado un

COLUMN_NAME
idCliente
idFactura

de un simple

 EXEC   getColumnsTable    @tableColumnsNames = N'MyProcTest'
1
задан 28.12.2016, 01:22
0 ответов

В конце концов я прибыл в ответ. exec был неполным. Себе отвечаю я единственно. Спасибо за опору FLixtr

DECLARE @sqlCompuesta varchar(MAX)
SET @sqlCompuesta='select c.idCliente,f.idFactura '+
                      'from Cliente c inner join Factura f on (c.idCliente=f.idCliente) '+
                      'where 1=1 '


EXEC (   'SELECT * into #temp1  FROM OpenQuery(MyServerConnection, '''+@sqlCompuesta+'''      )   '  +
         'SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS '+
         'WHERE TABLE_NAME like ''%#temp1%''    '  )
3
ответ дан 03.12.2019, 17:57

Ввиду консультации, которую ты хочешь реализовать, ты работаешь прямо с контентом подмостков, не с определением, чтобы получать имена колонн. Кроме которого, поместив условие where 1=2 никогда он не идет истекать и они не будут существовать оказанные тобой SELECT.

Чтобы знать имена колонн ты должен реализовывать один SELECT прямо в таблицу, где хранится определение таблицы. Я одинокий поместил бы stored procedure следующей формы:

CREATE PROCEDURE [dbo].[getColumnsTable]
    @tableColumnsNames  nvarchar(45)
AS          

SET NOCOUNT ON                     
BEGIN
    SELECT C.Name FROM sys.tables T
        INNER JOIN sys.columns C 
            ON T.object_id = C.object_id
    WHERE T.name = @tableColumnsNames
END

Где, ты реализуешь выполнение следующей формы:

EXEC getColumnsTable 'Cliente' 

Или в Вашем случае:

EXEC getColumnsTable 'Factura' 
1
ответ дан 03.12.2019, 17:57
  • 1
    Спасибо poor твой ответ Fixtr. Но это для двух подмостков только. Что произошел бы, если бы это была консультация большего количества подмостков. –  28.12.2016, 23:53
  • 2
    Но это помогает мне для двух подмостков только. Что произошло бы, если бы он захотел изменить мой Store procedure и сделать консультацию с 10 или 20 дружными подмостками? я было бы мало практическим вновь делать joins –  28.12.2016, 23:57
  • 3
    То, что он перемещает, что с тобой JOIN está s делая консультации, но в контент таблицы, что ты хочешь получить, является definició n таблицы. Которое я harí в es, что получать один " array " имен подмостков, что ты хочешь в переменной @tableColumnsNames, потом, сделать ту же консультацию, но в condició n помещать WHERE T.name IN (@tableColumnsNames) –  29.12.2016, 00:12
  • 4
    Сейчас. ¿ Возможно получать подмостки String, хранившегося в SP? –  29.12.2016, 00:31
  • 5
    Мне не удается поймать твой вопрос, ¿ podrí схвати давать мне немного má s детали? –  29.12.2016, 00:36

Начиная с SQL Server 2012, ты можешь использовать sys.dm_exec_describe_first_result_set чтобы получать этот результат.

Беря stored procedure, что pusistes как пример:

ALTER PROCEDURE MyProcTest AS 
BEGIN SET NOCOUNT ON; 
select c.idCliente,f.idFactura     
     from Cliente c inner join Factura f on (c.idCliente=f.idCliente)            
     where 1=2 
END

Если ты выполняешь следующую консультацию:

select name as column_name
  from sys.dm_exec_describe_first_result_set
         (N'[dbo].[MyProcTest]', null, 0)
 order by column_ordinal;

Полученный результат:

column_name
-----------
idCliente
idFactura

Demo

1
ответ дан 03.12.2019, 17:57
  • 1
    Это очень хороший выбор. Но я иду в SQLServer 2008 Спасибо за ответ. –  09.01.2017, 20:15