我有一个SelectSP,它返回我存储在临时表中的结果集。现在我想调用另一个名为InsertSP的SP,并将此临时表中的值作为参数传递给它。
这是我到目前为止的代码:
CREATE TABLE #tempTable
(
Field1 VARCHAR(255),
Field2 VARCHAR(255),
Field3 VARCHAR(255),
Field4 VARCHAR(255),
Field5 VARCHAR(255),
Field6 VARCHAR(255),
Field7 VARCHAR(255)
.
.
.
)
INSERT INTO #tempTable exec
usp_SelectSP 'p1' ,'p2', 'p3'
现在我想再执行一次SP并将tempTable的Field1,Field2,Field3作为参数传递给该SP。
我在想这样的事情
usp_InsertSP
@param1 = Field1
@Param2 = Field2
@Param3 = Field3
FROM #tempTable.
这样做的最佳方式是什么?
答案 0 :(得分:2)
如果您无法更改被叫SP,那么最简单的方法可能是光标:
DECLARE @f1 VARCHAR(255), @f2 VARCHAR(255) --, ...
DECLARE c CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR SELECT Field1, Field2 --, ...
FROM #tempTable;
OPEN c;
FETCH NEXT FROM c INTO @f1, @f2 --, ...
WHILE @@FETCH_STATUS <> -1
BEGIN
EXEC usp_InsertSP
@param1 = @f1,
@param2 = @f2 --, ...
FETCH NEXT FROM c INTO @f1, @f2 --, ...
END
CLOSE c;
DEALLOCATE c;
但是我强烈建议你改变被叫程序。如果您可以更改被调用的过程以直接使用它,那么几乎绝对有一种更有效的方法来处理此#temp表中的数据。
修改强>
证明被调用的proc可以看到调用者创建的#temp表。
CREATE PROCEDURE dbo.proc1
AS
BEGIN
SET NOCOUNT ON;
CREATE TABLE #t1(a INT);
INSERT #t1 SELECT 1 UNION SELECT 2;
EXEC dbo.proc2;
DROP TABLE #t1;
END
GO
CREATE PROCEDURE dbo.proc2
AS
BEGIN
SET NOCOUNT ON;
SELECT a FROM #t1;
END
GO
EXEC dbo.proc1;
结果:
a
-
1
2
答案 1 :(得分:1)
只是分享#TEMP表!!!
您需要阅读How to Share Data between Stored Procedures by Erland Sommarskog
所有嵌套的被调用过程都可以访问在父存储过程中创建的所有#temp表,请参阅:Sharing a Temp Table from the article listed above
来自文章:
The method itself is as simple as this:
CREATE PROCEDURE called_procedure @par1 int,
@par2 bit,
... AS
...
INSERT/UPDATE/DELETE #tmp
go
CREATE PROCEDURE caller AS
DECLARE ...
CREATE TABLE #mytemp (col1 int NOT NULL,
col2 char(5) NULL,
...)
...
EXEC called_procedure @par1, @par2 ...
SELECT * FROM #mytemp
go