2010-02-18 79 views
2

我有一個nvarchar參數的存儲過程。我希望調用者在使用此SP時提供一條sql命令的文本。如何執行作爲sp參數傳遞的sql文本?

如何從SP內執行提供的sql命令?

這甚至可能 -

我認爲它使用EXEC但以下是可能的:?表明它無法找到給定名稱的存儲過程

EXEC @script 

錯誤。由於它是一個腳本,這顯然是準確的,但是導致我認爲它不能按預期工作。

+1

我同意所有的安全意見,但你可以嘗試 [EXEC(@script)] 應該工作。 – Sparky 2010-02-18 05:45:10

+0

@Sparky:雖然有效,但'EXEC'不會緩存查詢計劃,而'EXEC sp_executesql'會:http://www.sommarskog.se/dynamic_sql.html – 2010-02-18 15:33:33

+0

確實如此,但是如果用戶要爲SQL(這讓我很害怕,但是),我希望查詢計劃有所不同。現在,如果我們只能說服人們不讓用戶這樣做...... – Sparky 2010-02-18 16:09:08

回答

8

用途:

BEGIN 

    EXEC sp_executesql @nvarchar_parameter 

END 

...假設參數是一個完整的SQL查詢。如果不是:

DECLARE @SQL NVARCHAR(4000) 
SET @SQL = 'SELECT ...' + @nvarchar_parameter 

BEGIN 

    EXEC sp_executesql @SQL 

END 

注意的SQL Injection attacks,我強烈建議閱讀。

+0

sp_executesql有所不同。看起來這篇文章將解釋爲什麼。謝謝。 – 2010-02-18 02:30:59

+1

@TheDeeno sp_executesql **不夠**。它仍然允許UPDATE,CREATE和DROP語句通過。您需要將其限制爲僅具有dbreader的用戶 – 2010-02-18 02:39:40

+0

如同Sparky建議的那樣,[EXEC(@script)]也適用。 – 2010-02-21 16:25:53

0

你可以在你的sp中執行@sqlStatement。雖然,它不是最好的事情,因爲它可以讓你打開sql注入。您可以看到一個示例here

+0

雖然有效,但'EXEC'不會緩存查詢計劃,而'EXEC sp_executesql'會:http://www.sommarskog.se/dynamic_sql.html – 2010-02-18 02:25:20

+0

啊,我編輯過慢。我沒有注射風險,因爲這隻會被管理員使用。我一定做錯了什麼。有什麼想法嗎? – 2010-02-18 02:25:38

0

您使用EXECUTE將該命令作爲字符串傳遞給它。請注意,由於難以驗證您正在盲目執行的SQL語句的非惡意性,因此可能會使您的系統面臨嚴重漏洞。

0

如何從SP內執行提供的sql命令?

非常仔細。該代碼可以做任何事情,包括添加或刪除記錄,甚至整個表或數據庫。

爲了安全起見,您需要創建一個單獨的用戶帳戶,該帳戶僅對一小組允許的表/視圖具有dbreader權限,並使用EXECUTE AS命令將該上下文限制爲該用戶。

+0

我很小心:) – 2010-02-18 02:30:02