我有一个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