2013-01-24 96 views
31
SELECT col1, 
     col2, 
     col3, 

EXEC GetAIntFromStoredProc(T.col1) AS col4 
    FROM Tbl AS T 
    WHERE (col2 = @parm) 

如何在SQL Server 2008中編寫此SQL查詢?如何在選擇查詢中執行存儲過程

+5

您應該查看函數,您不能從選擇查詢中調用存儲過程。 – twoleggedhorse

+1

select col1,col2,col3,EXEC GetAIntFromStoredProc(t.col1)as col4 FROM tbl as t where(col2 = @parm)IS NOT select col1,col2 FROM EXEC MyStoredProc'param1','param2'。這不是重複的,嘗試編輯但被拒絕,在這篇文章中的答案是正確的 – DooMMcQ

回答

31

感謝:

這裏的答案將解釋它比我好的人。

以下是解決方案。

  1. 首先,我們創建了一個功能

    CREATE FUNCTION GetAIntFromStoredProc(@parm Nvarchar(50)) RETURNS INTEGER 
    
    AS 
    BEGIN 
        DECLARE @id INTEGER 
    
        set @id= (select TOP(1) id From tbl where [email protected]) 
    
        RETURN @id 
    END 
    
  2. 然後我們做的選擇查詢

    Select col1, col2, col3, 
    GetAIntFromStoredProc(T.col1) As col4 
    From Tbl as T 
    Where [email protected] 
    
+36

但是,這不是存儲過程... – levi

+10

沒錯。正確的答案應該是「不可能的」。 – Tundey

+0

這不是對程序提出的字面問題的回答。這是一個具有巨大侷限性的替代方案。看到我的實際答案。 – BuvinJ

4

只要您沒有在存儲過程中執行任何INSERT或UPDATE語句,您可能需要將其作爲函數。

存儲過程用於由外部程序或定時間隔執行。 @twoleggedhorse

Function vs. Stored Procedure in SQL Server

+0

存儲過程可以用於「由外部程序執行或按照定時間隔」,但它們絕不限於那個,或者只是爲了那些目的。隨時編寫腳本以獨立運行,按需處理數據操作。 – BuvinJ

10

功能很容易的選擇循環中調用,但他們不」讓你運行插入,更新,刪除等等,它們只對查詢操作有用。您需要一個存儲過程來操作數據。

所以,這個問題的真正答案是,您必須通過「遊標」遍歷select語句的結果並從該循環內調用該過程。這裏有一個例子:

DECLARE @myId int; 
DECLARE @myName nvarchar(60); 
DECLARE myCursor CURSOR FORWARD_ONLY FOR 
    SELECT Id, Name FROM SomeTable; 
OPEN myCursor; 
FETCH NEXT FROM myCursor INTO @myId, @myName; 
WHILE @@FETCH_STATUS = 0 BEGIN 
    EXECUTE dbo.myCustomProcedure @myId, @myName; 
    FETCH NEXT FROM myCursor INTO @myId, @myName; 
END; 
CLOSE myCursor; 
DEALLOCATE myCursor; 

注意@@FETCH_STATUS是獲取你更新的標準變量。這裏的對象名稱的其餘部分是自定義的。

相關問題