0

У меня возникла проблема в том, что мне нужно знать столбцы любой хранимой процедуры, которая проходит как параметр внутри другого. Но в любом случае я не получаю никаких результатов.Определите столбцы динамической хранимой процедуры. SQL Server

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 

Это хранимая процедура, я хотел бы читать

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 

Я хотел бы получить

COLUMN_NAME 
idCliente 
idFactura 

от простого

EXEC getColumnsTable @tableColumnsNames = N'MyProcTest' 

Возможно ли это ? Я не нашел решение.

+0

Por favor use http://es.stackoverflow.com/ si quiere usar espanol. –

+0

По-английски !! Благодаря!! –

ответ

0

SQL Server 2008: саз вы попробуете так:

USE dbtest 
    GO 
    IF OBJECT_ID('sp_test') IS NOT NULL DROP PROCEDURE sp_test 
    GO 
    CREATE PROCEDURE sp_test 
    AS 
    BEGIN 

     SET NOCOUNT ON; 
     SELECT 1 AS col1, 'string' AS col2 
    END 
    GO 

    IF OBJECT_ID('tempdb..#tt') IS NOT NULL DROP TABLE #tt 
    SELECT * INTO #tt FROM OPENROWSET('SQLNCLI', 'server=(local);trusted_connection=yes', 'exec dbtest.dbo.sp_test') WHERE 1!=1 
    exec tempdb..sp_columns '#tt' 

SQL 2012 и выше: вы можете использовать DMV sys.dm_exec_describe_first_result_set_for_object

Пример:

SELECT * FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('sp_who'), 0) ; 
 
is_hidden column_ordinal name                                is_nullable system_type_id system_type_name 
--------- -------------- -------------------------------------------------------------------------------------------------------------------------------- ----------- -------------- -------------------------------------------------------------------------------------------------------------------------------- 
0   1    spid                                0   52    smallint 
0   2    ecid                                0   52    smallint 
0   3    status                               0   239   nchar(30) 
0   4    loginame                               1   231   nvarchar(128) 
0   5    hostname                               0   239   nchar(128) 
0   6    blk                                1   175   char(5) 
0   7    dbname                               1   231   nvarchar(128) 
0   8    cmd                                0   239   nchar(16) 
0   9    request_id                              0   56    int 
+0

Этот DMV доступен для SQL Server ** 2012 ** и новее. –

+0

Спасибо за ваш анонс Nolan –

+0

Но это выглядит: Msg 208, Level 16, State 1, Line 2 Неверное имя объекта 'sys.dm_exec_describe_first_result_set'. –

0

И наконец, решила проблему, выполнив ее a Незавершенный

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, '''[email protected]+'''  ) ' + 
     'SELECT * FROM tempdb.INFORMATION_SCHEMA.COLUMNS '+ 
     'WHERE TABLE_NAME like ''%#temp1%'' ' ) 
Смежные вопросы