2012-03-28 23 views
0

我有一個SelectSP,它返回存儲在臨時表中的結果集。現在我想調用另一個名爲InsertSP的SP,並將此臨時表中的值作爲參數傳遞給它。如何從臨時表中選擇值並將它們作爲參數傳遞給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並通過字段1,字段2,不是Temptable的字段3作爲參數傳遞給該SP。

我在想這樣的事情

usp_InsertSP 
    @param1 = Field1 
    @Param2 = Field2 
    @Param3 = Field3 

FROM #tempTable. 

什麼是做到這一點的最好方法是什麼?

+0

是:Sharing a Temp Table from the article listed above

從文章

你試圖爲單行調用存儲過程還是需要多次調用該過程,每行調用一次?爲什麼被調用的過程只是'SELECT values FROM#temp'?被調用者應該可以看到調用者創建的#temp表。 – 2012-03-28 14:47:51

+0

我需要多次調用 – Asdfg 2012-03-28 14:48:59

+0

我無法更改InsertSP。我已經傳遞參數給它。 – Asdfg 2012-03-28 14:50:11

回答

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 
+0

我可以嘗試讓DBA更改SP。我是否應該要求他們進行條件插入,如果#tempTable存在,請不要從參數中插入數據? – Asdfg 2012-03-28 14:57:37

+0

不,他們應該能夠做的只是簡單的'INSERT dbo.table(col1,col2,...)SELECT field1,field2,... FROM #tempTable;' - 因爲被調用的SP可以看到#temp表! – 2012-03-28 15:03:50

+0

還有一些其他地方可以調用InsertSP,並將參數傳遞給它。我也希望這樣也能工作。 – Asdfg 2012-03-28 15:07:48

1

直接共用#TEMP TABLE !!!

您需要閱讀How to Share Data between Stored Procedures by Erland Sommarskog

在父存儲過程創建的所有#TEMP表是所有嵌套調用的過程訪問,請參見:

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 
+0

這個。我的上帝這。 – 2012-03-28 16:27:23

相關問題