以前可能有人问过这个问题,但我找不到令人满意的答案。
我需要将存储过程的结果插入到临时表中,例如:
INSERT INTO #TEMP EXEC MY_SP
我事先不知道 SP 将返回多少列,因此我需要准备我的#TEMP 表(通过动态 ALTER .. ADD 命令)以添加列以匹配 SP 结果集。
假设是 - SP 不接受任何参数并且列数始终相同。但是如何在 SP 之外的纯 TSQL 中确定该数字,以便可以将其存储到变量中?
以前可能有人问过这个问题,但我找不到令人满意的答案。
我需要将存储过程的结果插入到临时表中,例如:
INSERT INTO #TEMP EXEC MY_SP
我事先不知道 SP 将返回多少列,因此我需要准备我的#TEMP 表(通过动态 ALTER .. ADD 命令)以添加列以匹配 SP 结果集。
假设是 - SP 不接受任何参数并且列数始终相同。但是如何在 SP 之外的纯 TSQL 中确定该数字,以便可以将其存储到变量中?
这有点尴尬,但你可以这样做:
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 以避免必须提前知道存储过程输出的形状,但它被拒绝了
艰难的一个,特别是如果其他人拒绝您运行所需的权限,例如 OPENROWSET。
您是否考虑过对 SP 进行解包/编写脚本并将其内容直接添加到您的 T-SQL 中?通过这种方式,您可以随意修改和调整它。
否则,如果你能解释更多关于 SP 的信息:
祝你好运!
让我从一开始就说,如果我必须这样做,我会尝试在 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
这对您的问题来说是一个糟糕的解决方案,因为您丢失了列的数据类型、它们的名称等。
我不懂语法,这可能不是最好的方法,但似乎有人通过转换为 xml 并解析它来做到这一点:Dynamic query results into a temp table or table variable