2010-04-28 18 views

回答

2

有一些例外EXEC('sql stmnt')是当你没有别的选择,你用什么。

它允许您动态构建语句并执行它,这通常是实现对象名称变量且事先不知道时的唯一方法。

在动态SQL上阅读article,它解释了何时/为什么动态SQL有用的场景&详细介绍了EXEC()

对于在存储过程中运行SQL语句,并在程序运行它作为EXEC(@SQL_STRING)之间的差异:

  • @SQL_STRING引用的对象都不会是T-的checked
  • 无SQL代码将被验证的语法和输入@SQL_STRING检查
  • 东西是其自身相对于SP的范围内
  • 你冒着被粗心和不良形成@SQL_STRING这可能导致安全问题。
  • @SQL_STRING的查询计划将被缓存,但只有在随后的EXEC(@SQL_STRING)与其完全匹配时才能重新使用,如果所有更改均为参数,则可以重用单个查询计划。
+0

你最后一点是错误的。在执行任何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

0

DIFF:

  • 随着exec语句可以创建执行哪个是动态创建查询,存储在一个变量[你在某些情况下,使用此] 。
0

有很多在BOL的注释部分有趣的信息,如:

变化数据库上下文最后只剩 直到EXECUTE 语句的结束。例如,在运行以下语句中的EXEC 之后,数据库上下文为主节点,即 。与字符串文字

USE master; EXEC ('USE AdventureWorks; SELECT EmployeeID, Title FROM HumanResources.Employee;'); 
相关问题