sp_executeSQL vs exec

时间:2013-01-24 00:37:43

标签: sql tsql stored-procedures dynamic sql-server-2000

正如我在以下博客中看到的那样......

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 btw ...而且我已经用Google搜索了,我发现没有结果如何操作sql server 2000的大字符串,但我有SQLi攻击的后果。

1 个答案:

答案 0 :(得分:3)

如果你问你是否可以这样做:

EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;

不,您不能将表达式或公式作为参数值。但你为什么需要?解决方法很简单,只需将它们附加到一个中间变量中(这应该是NVARCHAR(MAX),而不是NTEXT,它已被弃用且对局部变量无效):

DECLARE @sql NVARCHAR(MAX);

...

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

EXEC sp_executesql @sql;

实际上所有这些变量都应该是NVARCHAR

请参阅this post for some more on EXEC vs. sp_executesql