3

以前可能有人问过这个问题,但我找不到令人满意的答案。

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

INSERT INTO #TEMP EXEC MY_SP

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

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

4

4 回答 4

2

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

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

我已经请求了一个 EXECUTE INTO 语法,比如 SELECT INTO 以避免必须提前知道存储过程输出的形状,但它被拒绝了

于 2012-07-23T19:03:43.927 回答
2

艰难的一个,特别是如果其他人拒绝您运行所需的权限,例如 OPENROWSET。

您是否考虑过对 SP 进行解包/编写脚本并将其内容直接添加到您的 T-SQL 中?通过这种方式,您可以随意修改和调整它。

否则,如果你能解释更多关于 SP 的信息:

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

祝你好运!

于 2012-07-26T14:19:30.850 回答
1

让我从一开始就说,如果我必须这样做,我会尝试在 SQL 环境或其他东西之外找到一种方法,因为我提供的解决方案不是做到这一点的好方法,但它确实有效。所以我并不是说这是一个好主意。我有一个名为 test 的 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

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

于 2012-07-28T20:48:20.870 回答
0

我不懂语法,这可能不是最好的方法,但似乎有人通过转换为 xml 并解析它来做到这一点:Dynamic query results into a temp table or table variable

于 2012-07-28T23:11:55.667 回答