0

正如我在以下博客中所读到的......

http://www.sommarskog.se/dynamic_sql.html

动态 sql 是不安全的,这就是我们有 sp_execute SQL 的原因。

请问,有什么办法可以让 sp_execute 运行这样的程序...

declare @QueryMain as varchar(8000)
declare @QueryBody as varchar(8000)
declare @QueryWhere as varchar(8000)

set @QueryMain = <8000 charactes>
set @QueryBody = <8000 characters>
set @QueryWhere = <8000 characters>

exec (@queryMain+@QueryBody+@QueryWhere)

这会运行,但正如我在文章中读到的那样,不建议这样做......但我想知道是否有另一种方式来运行这种查询......我试图将 3 个变量合并到 ntext 但是它没有用,顺便说一句......上面的示例查询将在查询中包含其他变量,可能是日期、用户 ID 等等!

我正在使用 sql server 2000 顺便说一句...并且正如我在谷歌上搜索的那样,我没有发现如何为 sql server 2000 操作大字符串的结果,但我有 SQLi 攻击的这种后果。

4

1 回答 1

3

If you're asking if you can do this:

EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;

No, you cannot have expressions or formulas as parameter values. But why do you need to? The workaround is simple, just append them in an intermediate variable (and this should be NVARCHAR(MAX), not NTEXT which is both deprecated and isn't valid for local variables):

DECLARE @sql NVARCHAR(MAX);

...

SET @sql = @QueryMain + @QueryBody + @QueryWhere;

EXEC sp_executesql @sql;

In fact all of these variables should be NVARCHAR.

See this post for some more on EXEC vs. sp_executesql.

于 2013-01-24T01:44:29.757 回答