TSQL:确定存储过程返回的列数

时间:2012-07-23 18:53:20

标签: tsql stored-procedures dynamic temp-tables

之前可能已经提出这个问题,但我找不到令人满意的答案。

我需要将存储过程的结果插入到临时表中,例如:

INSERT INTO #TEMP EXEC MY_SP

我事先并不知道SP将返回多少列,因此我需要准备我的#TEMP表(通过动态ALTER .. ADD命令)来添加列以匹配SP结果集。

假设是 - SP不接受任何参数,列数始终相同。但是,如何在SP之外的纯TSQL中确定该数字,以便将其存储到变量中?

4 个答案:

答案 0 :(得分:2)

这有点尴尬,但你可以这样做:

SELECT * INTO #temp 
FROM OPENROWSET('SQLOLEDB','Data Source=MyServer;Trusted_Connection=yes;Integrated Security=SSPI', 'EXECUTE MyDB.MySchema.MyProcedure @MyParm=123')

requested有一个EXECUTE INTO语法,比如SELECT INTO,以避免事先知道存储过程输出的形状,但它被拒绝了

答案 1 :(得分:2)

艰难的一个,特别是如果其他人否认你有必要的权限来运行,例如OPENROWSET。

您是否考虑过拆包/编写SP并将其内容直接添加到您的T-SQL?通过这种方式,您可以根据需要修改和调整它。

否则,如果您可以解释有关SP的更多信息:

  • SP做什么?
  • 输出什么样的信息? One-N列, - 多少行?
  • 是慢还是快? (我们也许可以使用蛮力[try-catch]方法)?
  • 如何确定要输出的列以及更改的频率?
  • 您能以任何方式预先确定列吗? (这样您可以使用INSERT #temp EXEC sp_getData语法)。

祝你好运!

答案 2 :(得分:1)

让我从一开始就说,如果我必须这样做,我会尝试在SQL环境之外找到一种方法来做到这一点,因为我提供的解决方案并不是一个很好的方法,但它作品。所以我不是说这是个好主意。 我有一个叫做测试的sp:

CREATE PROCEDURE Test
AS
SELECT 1 as One, 2 as Two

要动态执行此操作,请执行以下操作:

DECLARE @i int
SET @i = 1;
DECLARE @SUCESS bit 
SET @SUCESS = 0
WHILE(@SUCESS = 0)
BEGIN 
  DECLARE @proc VARCHAR(MAX)
  DECLARE @count int
  SET @count = 1
  SET @proc = 'DECLARE @t TABLE ( c1 varchar(max) '
  WHILE @count < @i 
  BEGIN 
    SET @proc = @proc + ', c' + CONVERT(varchar, @count + 1) + ' varchar(max) '
    print @proc 
    SET @count = @count + 1
  END
  SET @proc = @proc + '); INSERT INTO @t EXEC Test'
  BEGIN TRY
    EXEC(@proc);
    SET @SUCESS = 1
  END TRY
  BEGIN CATCH
    SET @i = @i+1
  END CATCH

END

SET @proc = @proc + '; SELECT * into ##t FROM @t '
EXEC( @proc )

SELECT * from ##t

对于您的问题,这是一个糟糕的解决方案,因为您丢失了列的数据类型,名称等。

答案 3 :(得分:0)

我不理解语法,这可能不是最好的方法,但有人似乎已经完成了转换为xml并解析它:Dynamic query results into a temp table or table variable