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 

내가 간단한

EXEC getColumnsTable @tableColumnsNames = N'MyProcTest' 

에서

COLUMN_NAME 
idCliente 
idFactura 

를 얻을 싶습니다 읽을되어이 가능 ? 솔루션을 찾지 못했습니다.

+0

즐거운 사용 http://es.stackoverflow.com/ si quiere usar espanol. –

+0

영어로 !! 감사!! –

답변

0

SQL 서버 2008 : 이 같은 시도 CAS :

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

Anolser에 감사드립니다 Nolan –

+0

하지만이 나타납니다 : 메시지 208, 수준 16, 상태 1, 줄 2 잘못된 개체 이름 'sys.dm_exec_describe_first_result_set'. –

0

마지막으로 y 문제를 해결하고 exec 불완전한

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%'' ' )