我有一個nvarchar參數的存儲過程。我希望調用者在使用此SP時提供一條sql命令的文本。如何執行作爲sp參數傳遞的sql文本?
如何從SP內執行提供的sql命令?
這甚至可能 -
我認爲它使用EXEC但以下是可能的:?表明它無法找到給定名稱的存儲過程
EXEC @script
錯誤。由於它是一個腳本,這顯然是準確的,但是導致我認爲它不能按預期工作。
我有一個nvarchar參數的存儲過程。我希望調用者在使用此SP時提供一條sql命令的文本。如何執行作爲sp參數傳遞的sql文本?
如何從SP內執行提供的sql命令?
這甚至可能 -
我認爲它使用EXEC但以下是可能的:?表明它無法找到給定名稱的存儲過程
EXEC @script
錯誤。由於它是一個腳本,這顯然是準確的,但是導致我認爲它不能按預期工作。
用途:
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,我強烈建議閱讀。
sp_executesql有所不同。看起來這篇文章將解釋爲什麼。謝謝。 – 2010-02-18 02:30:59
@TheDeeno sp_executesql **不夠**。它仍然允許UPDATE,CREATE和DROP語句通過。您需要將其限制爲僅具有dbreader的用戶 – 2010-02-18 02:39:40
如同Sparky建議的那樣,[EXEC(@script)]也適用。 – 2010-02-21 16:25:53
你可以在你的sp中執行@sqlStatement。雖然,它不是最好的事情,因爲它可以讓你打開sql注入。您可以看到一個示例here
雖然有效,但'EXEC'不會緩存查詢計劃,而'EXEC sp_executesql'會:http://www.sommarskog.se/dynamic_sql.html – 2010-02-18 02:25:20
啊,我編輯過慢。我沒有注射風險,因爲這隻會被管理員使用。我一定做錯了什麼。有什麼想法嗎? – 2010-02-18 02:25:38
您使用EXECUTE
將該命令作爲字符串傳遞給它。請注意,由於難以驗證您正在盲目執行的SQL語句的非惡意性,因此可能會使您的系統面臨嚴重漏洞。
如何從SP內執行提供的sql命令?
非常仔細。該代碼可以做任何事情,包括添加或刪除記錄,甚至整個表或數據庫。
爲了安全起見,您需要創建一個單獨的用戶帳戶,該帳戶僅對一小組允許的表/視圖具有dbreader權限,並使用EXECUTE AS命令將該上下文限制爲該用戶。
我很小心:) – 2010-02-18 02:30:02
我同意所有的安全意見,但你可以嘗試 [EXEC(@script)] 應該工作。 – Sparky 2010-02-18 05:45:10
@Sparky:雖然有效,但'EXEC'不會緩存查詢計劃,而'EXEC sp_executesql'會:http://www.sommarskog.se/dynamic_sql.html – 2010-02-18 15:33:33
確實如此,但是如果用戶要爲SQL(這讓我很害怕,但是),我希望查詢計劃有所不同。現在,如果我們只能說服人們不讓用戶這樣做...... – Sparky 2010-02-18 16:09:08