如何从临时表中选择值并将它们作为参数传递给SP

时间:2012-03-28 14:45:56

标签: sql-server sql-server-2005 stored-procedures

我有一个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.

这样做的最佳方式是什么?

2 个答案:

答案 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