之前可能已经提出这个问题,但我找不到令人满意的答案。
我需要将存储过程的结果插入到临时表中,例如:
INSERT INTO #TEMP EXEC MY_SP
我事先并不知道SP将返回多少列,因此我需要准备我的#TEMP表(通过动态ALTER .. ADD命令)来添加列以匹配SP结果集。
假设是 - SP不接受任何参数,列数始终相同。但是,如何在SP之外的纯TSQL中确定该数字,以便将其存储到变量中?
答案 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的更多信息:
祝你好运!
答案 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