【问题标题】:Concatenated SQL statement连接的 SQL 语句
【发布时间】:2015-08-05 18:57:20
【问题描述】:

我正在处理从sys.database 主表构建表名列表的查询。然后,我在 concat 语句中使用这些名称来从每个数据库中提取特定的信息。我正在通过一个 while 循环运行整个事情,以使用计数器来命中所有表。

set @sql = 'select top 10 * from ' + (select dbname from @table where tabid = @i + '.dbo.**tablename** where NAME = '**String Value**'

当我只是print@sql 的结果时,它给了我正确的语法,我可以毫无问题地运行命令。

当我将@sql 设置为exec 时,出现错误

“从 dbname 中选择的前 10 个数据库 * 不存在。”

就像执行忽略了选择之后的所有内容。

【问题讨论】:

  • @TrippKinetics,这并不是真正的 sql 注入问题 - 他在 SSMS 之类的东西中完成了这一切。 Gregory,你能发布所有相关的代码吗?您只发布了一行的一部分,不足以说明实际情况。
  • @TrippKinetics 他正在构建动态 SQL。你不能参数化表名。
  • @DanField:如果连接中使用的任何值来自用户输入,则它可以是 SQL 可注入的。无论代码在哪里执行,如果用户提供或在任何时候有机会更改该值,则应将其视为一个值,而不是可执行代码的一部分。
  • 是的,我的意思是说我假设他这样做是一项管理任务,而不是基于(非管理员)用户输入的任务。例如,我已经做了这样的事情来动态构建插入/创建语句 - 意味着在设计过程或其他东西时一次性使用。
  • @GregoryWallace,你可以看看sp_msforeachtable函数

标签: sql sql-server


【解决方案1】:

我怀疑你错误地调用了 EXEC。

使用 T-SQL 查询调用 'exec' 时,请务必将目标字符串括在括号中,例如

DECLARE @FOO VARCHAR(100)
Set @FOO = 'SELECT TOP 5 * from SOMETABLE'
EXEC (@FOO) -- not EXEC @FOO

【讨论】:

    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2016-07-31
    • 2015-02-20
    • 2011-12-12
    • 2018-12-18
    • 1970-01-01
    相关资源
    最近更新 更多