请告诉我有什么区别 ==>如果我直接在storedprocedure中写入查询 ==>并在字符串变量中写入查询并在exec中运行它存储过程。请告诉我直接运行查询和使用exec执行它的区别
我使用的MS SQL Server 2005
请告诉我有什么区别 ==>如果我直接在storedprocedure中写入查询 ==>并在字符串变量中写入查询并在exec中运行它存储过程。请告诉我直接运行查询和使用exec执行它的区别
我使用的MS SQL Server 2005
有一些例外EXEC('sql stmnt')
是当你没有别的选择,你用什么。
它允许您动态构建语句并执行它,这通常是实现对象名称变量且事先不知道时的唯一方法。
在动态SQL上阅读article,它解释了何时/为什么动态SQL有用的场景&详细介绍了EXEC()
。
对于在存储过程中运行SQL语句,并在程序运行它作为EXEC(@SQL_STRING)
之间的差异:
@SQL_STRING
引用的对象都不会是T-的checked@SQL_STRING
检查@SQL_STRING
这可能导致安全问题。@SQL_STRING
的查询计划将被缓存,但只有在随后的EXEC(@SQL_STRING)
与其完全匹配时才能重新使用,如果所有更改均为参数,则可以重用单个查询计划。DIFF:
有很多在BOL的注释部分有趣的信息,如:
变化数据库上下文最后只剩 直到EXECUTE 语句的结束。例如,在运行以下语句中的EXEC 之后,数据库上下文为主节点,即 。与字符串文字
USE master; EXEC ('USE AdventureWorks; SELECT EmployeeID, Title FROM HumanResources.Employee;');
EXEC命令是容易出错和不安全(SQL注入),因为执行只是执行任何你给它。
检查安全公告:http://msdn.microsoft.com/en-us/library/ms188332.aspx
你最后一点是错误的。在执行任何T-SQL时,查询将被散列并与保存的执行计划进行比较。这意味着如果变量发生变化,它仍然可以像使用存储过程一样重新使用具有动态SQL的计划。这是在这里引用:http://www.codinghorror。com/blog/2004/10/who-needs-stored-procedures-anyways.html 此外,您可以使用动态SQL和参数来避免SQL注入攻击,如下所示:http://www.uberasp.net/getarticle的.aspx?ID = 46 – 2010-04-28 10:34:03