Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sp_execute SQL vs exec_Sql_Tsql_Stored Procedures_Dynamic_Sql Server 2000 - Fatal编程技术网

sp_execute SQL vs exec

sp_execute SQL vs exec,sql,tsql,stored-procedures,dynamic,sql-server-2000,Sql,Tsql,Stored Procedures,Dynamic,Sql Server 2000,正如我在下面的博客中读到的 动态sql是不安全的,这就是为什么我们有sp_执行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 cha

正如我在下面的博客中读到的

动态sql是不安全的,这就是为什么我们有sp_执行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)
将@QueryMain声明为varchar(8000)
将@QueryBody声明为varchar(8000)
将@QueryWhere声明为varchar(8000)
set@QueryMain=
set@QueryBody=
设置@QueryWhere=
exec(@queryMain+@QueryBody+@QueryWhere)
这将运行,但正如我在文章中读到的,不建议使用。。。但我想知道是否有其他方法来运行这种查询。。。我试图将这3个变量合并到ntext中,但没有成功,顺便说一句。。。上面的示例查询将在查询中包含其他变量,可以是日期、用户ID、任何内容


我正在使用sql server 2000 btw。。。正如我在谷歌上搜索到的,我没有发现如何为sql server 2000操作大字符串的结果,但我有SQLi攻击的后果。

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

EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;
否,不能将表达式或公式作为参数值。但你为什么要这么做?解决方法很简单,只需将它们附加到一个中间变量中(这应该是
NVARCHAR(MAX)
,而不是
NTEXT
,后者既不推荐使用,也对局部变量无效):

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


请参阅。

如果您询问是否可以这样做:

EXEC sp_executesql @QueryMain + @QueryBody + @QueryWhere;
否,不能将表达式或公式作为参数值。但你为什么要这么做?解决方法很简单,只需将它们附加到一个中间变量中(这应该是
NVARCHAR(MAX)
,而不是
NTEXT
,后者既不推荐使用,也对局部变量无效):

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


请参阅。

为什么要运行此类查询?您将始终拥有实际的SQL语句,因为您正在构建它。你是想让它从一段代码中运行吗?@twoleggedhorse因为我正在将每个sql脚本从系统迁移到存储过程中,经过我的测试,sql脚本很容易受到sql注入的攻击。它们是由过去的程序员开发的遗留系统,忽略了这种威胁的风险。为什么要运行这种查询?您将始终拥有实际的SQL语句,因为您正在构建它。你是想让它从一段代码中运行吗?@twoleggedhorse因为我正在将每个sql脚本从系统迁移到存储过程中,经过我的测试,sql脚本很容易受到sql注入的攻击。他们认为我们是由过去的程序员开发的遗留系统,并且忽略了这种威胁的风险。@Aaron_bertrand我之所以不使用nvarchar(max)是因为我们只有sql server 2000,而这个版本不支持nvarchar(max),但我正在将系统中嵌入的所有sql脚本迁移到存储过程中,并降低sql的风险injections@Joshua抱歉,我错过了SQL Server 2000标记。但是我认为你给了自己一种虚假的安全感。。。为什么您认为使用一堆未经验证的文本并使用sp_executesql执行比使用EXEC更安全?sp_executesql之所以更安全,是因为它促进了强类型参数的使用,而不是因为它神奇地阻止了自身的注入。您不打算以有助于IMHO的方式使用它,所以请继续使用EXEC。@Aaron_bertrand感谢您的澄清,我真的很想了解更多。谢谢你的知识,先生@Aaron_bertrand我之所以不使用nvarchar(max)是因为我们只有sql server 2000,而这个版本还不支持nvarchar(max),我正在将系统中嵌入的每个sql脚本迁移到存储过程中,以降低sql的风险injections@Joshua抱歉,我错过了SQL Server 2000标记。但是我认为你给了自己一种虚假的安全感。。。为什么您认为使用一堆未经验证的文本并使用sp_executesql执行比使用EXEC更安全?sp_executesql之所以更安全,是因为它促进了强类型参数的使用,而不是因为它神奇地阻止了自身的注入。您不打算以有助于IMHO的方式使用它,所以请继续使用EXEC。@Aaron_bertrand感谢您的澄清,我真的很想了解更多。谢谢你的知识,先生!