正如我在以下博客中看到的那样......
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攻击的后果。
答案 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
。