这个问题以前可能有人问过,但我找不到一个令人满意的答案。
我需要将存储过程的结果插入到一个临时表中,如下所示:
INSERT INTO #TEMP EXEC MY_SP
我事先不知道SP将返回多少列,因此我需要准备我的#TEMP表(通过dynamic ALTER ..添加命令)添加列以匹配SP结果集。
假设- SP不接受任何参数,并且列数始终相同。但是,我如何在SP之外的纯TSQL中确定这个数字,这样我就可以将它存储到变量中?
发布于 2012-07-26 14:19:31
一个困难的问题,特别是当其他人拒绝你运行OPENROWSET的必要权限时。
您是否考虑过对SP进行解包/编写脚本,并将其内容直接添加到T-SQL中?通过这种方式,您可以随心所欲地修改和调整它。
否则,如果您可以解释有关SP的更多信息:
祝你好运!
发布于 2012-07-23 19:03:44
这有点尴尬,但你可以这样做:
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,以避免事先知道存储的proc输出的形状,但它被拒绝了
发布于 2012-07-28 20:48:21
让我从一开始就说,如果我必须这样做,我会尝试在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
对于您的问题,这是一个糟糕的解决方案,因为您已经丢失了列的数据类型、列的名称等。
https://stackoverflow.com/questions/11618634
复制相似问题