2010-02-18 43 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