【问题标题】:How do I execute sql text passed as an sp parameter?如何执行作为 sp 参数传递的 sql 文本?
【发布时间】:2011-01-18 03:45:55
【问题描述】:

我有一个带有 nvarchar 参数的存储过程。我希望调用者在使用此 SP 时为 sql 命令提供文本。

如何从 SP 中执行提供的 sql 命令?

这可能吗?-

我认为可以使用 EXEC,但如下:

EXEC @script

错误表明它无法找到给定名称的存储过程。由于它是一个脚本,这显然是准确的,但让我认为它没有按预期工作。

【问题讨论】:

  • 我同意所有的安全 cmets,但您可以尝试 [EXEC (@script) ],它应该可以工作。
  • @Sparky:虽然有效,但EXEC 不会缓存查询计划,而EXEC sp_executesql 将:sommarskog.se/dynamic_sql.html
  • 是的,但是如果用户要为 SQL 提供文本(这让我很害怕,但是),我希望查询计划会有所不同。现在,如果我们只能说服人们不要让用户这样做......
  • [ EXEC (@script) ] 也可以。谢谢 Sparky。

标签: sql sql-server sql-server-2005 tsql dynamic-sql


【解决方案1】:

用途:

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,我强烈推荐阅读The curse and blessing of Dynamic SQL

【讨论】:

  • sp_executesql 有所作为。看起来文章会解释原因。谢谢。
  • @TheDeeno sp_executesql 不够。它仍将允许 UPDATE、CREATE 和 DROP 语句通过。您需要将其限制为只有 dbreader 的用户
  • 将 EXEC sp_executesql 调用包装在 BEGIN/END 块中的原因是什么?
【解决方案2】:

你可以在你的 sp 中执行 @sqlStatement。不过,这不是最好的做法,因为它可以让您接受 sql 注入。可以看一个例子here

【讨论】:

  • 虽然有效,EXEC 不会缓存查询计划,而EXEC sp_executesql 将:sommarskog.se/dynamic_sql.html
  • 啊,我编辑得慢了。我对注入风险没意见,因为这只会由管理员使用。我一定做错了什么。有什么想法吗?
【解决方案3】:

您使用EXECUTE 将命令作为字符串传递给它。请注意,由于很难验证您盲目执行的 SQL 语句的非恶意性,这可能会使您的系统面临严重的漏洞。

【讨论】:

    【解决方案4】:

    如何从 SP 中执行提供的 sql 命令?

    非常小心。该代码可以做任何事情,包括添加或删除记录,甚至整个表或数据库。

    为了安全起见,您需要创建一个单独的用户帐户,该帐户仅对一小部分允许的表/视图具有 dbreader 权限,并使用EXECUTE AS 命令将上下文限制为该用户。

    【讨论】:

      猜你喜欢
      • 2011-05-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-06-06
      • 2016-11-15
      • 2011-11-28
      相关资源
      最近更新 更多