2009-04-10 24 views
34

是否有機會在MS SQL 2005上創建臨時存儲過程或函數?我想只在我的查詢中使用這個存儲過程,所以執行後它將不見了。T-SQL中的臨時函數或存儲過程

我有一個查詢,我想EXEC對一些數據。但是對於每個表我都會處理這個命令,我需要改變它的一些部分。所以我想我會創建一個臨時SP,它會爲我提供一個來自我提供的參數(如表名等)的查詢,然後由EXEC執行這個查詢。

而這個存儲過程對我以後將不會有用,所以我想暫時讓它有用,這樣當我結束執行我的查詢時它就會消失。

+1

編輯答案您的評論 – 2009-04-10 10:31:24

回答

27

重新編輯 - 這聽起來像你應該使用sp_ExecuteSQL對包含TSQL的(參數化的)nvarchar

在sp_ExecuteSQL上搜索;一個簡單的例子:

DECLARE @SQL nvarchar(4000), 
@Table varchar(20) = 'ORDERS', 
@IDColumn varchar(20) = 'OrderID', 
@ID int = 10248 

SET @SQL = 'SELECT * FROM [' + @Table + '] WHERE [' 
    + @IDColumn + '] = @Key' 

    EXEC sp_executesql @SQL, N'@Key int', @ID 

注意,表名和列名必須被級聯到查詢,但值(如@Key)可被參數化。


有一個臨時存儲過程 - 但它是每個連接,而不是每個sp。

但是,您可能需要查看公共表格表達式 - 它們可能是您以後的內容(儘管您只能從中讀取一次)。

也許如果你可以澄清你想要什麼

+0

你能澄清「臨時存儲過程」位嗎?你的意思是sp_prepare或sp_executesql? – gbn 2009-04-10 08:25:50

+1

我已經添加了一些關於我嘗試實現的更多內容。希望它有助於理解我的想法。 – 2009-04-10 08:51:24

-3

只需在查詢中使用存儲過程的SQL。無需在數據庫中創建存儲過程,它不會爲您的查詢中的普通查詢帶來任何優勢。

+14

但這不允許重用存儲的proc代碼 - 我認爲這是一種有益於此方法。 – Tone 2011-06-24 14:40:11

26

此問題有點舊,但其他答案未能提供創建臨時過程的語法。語法與臨時表相同:#本地臨時對象的名稱,##全局臨時對象的名稱。

CREATE PROCEDURE #uspMyTempProcedure AS 
BEGIN 
    print 'This is a temporary procedure' 
END 

這在官方文檔的「過程名稱」部分進行了描述。 http://technet.microsoft.com/en-us/library/ms187926%28v=sql.90%29.aspx

我正在使用此技術爲我的原始T-SQL單元測試重複數據刪除代碼。一個真正的單元測試框架會更好,但這比沒有好,「垃圾收集」好。