【问题标题】:Determine the columns of a dynamic stored procedure. SQL Server确定动态存储过程的列。 SQL 服务器
【发布时间】:2016-12-27 22:27:52
【问题描述】:

我有一个问题,我需要知道作为参数传递给另一个存储过程的任何存储过程的列。但无论如何我都没有得到任何结果。

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'

这可能吗?我还没有找到解决办法。

【问题讨论】:

标签: sql-server stored-procedures calculated-columns openquery


【解决方案1】:

终于 y 解决了问题,执行它的不完整

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

【讨论】:

    【解决方案2】:

    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 小整数 0 3 状态 0 239 nchar(30) 0 4 登录名 1 231 nvarchar(128) 0 5 主机名 0 239 nchar(128) 0 6 块 1 175 个字符 (5) 0 7 数据库名称 1 231 nvarchar(128) 0 8 cmd 0 239 nchar(16) 0 9 request_id 0 56 整数

    【讨论】:

    • 此 DMV 仅适用于 SQL Server 2012 及更高版本。
    • 感谢诺兰的回答
    • 但这出现了:Msg 208, Level 16, State 1, Line 2 Invalid object name 'sys.dm_exec_describe_first_result_set'。
    • 我有 SQL Server 2008。
    猜你喜欢
    • 2013-02-28
    • 2018-04-01
    • 2018-11-13
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    相关资源
    最近更新 更多