请告诉我直接运行查询和使用exec执行它之间的区别

时间:2010-04-28 09:23:14

标签: sql-server stored-procedures

请告诉我有什么区别 ==>如果我直接在storedprocedure中编写查询 ==>并在字符串变量中写入查询,然后在存储过程的exec中运行它。

我正在使用ms sql server 2005

4 个答案:

答案 0 :(得分:2)

除了一些例外情况,EXEC('sql stmnt')是您在没有其他选择时使用的。

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

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

至于在存储过程中运行SQL语句与在EXEC(@SQL_STRING)过程中运行它之间的区别:

  • @SQL_STRING中引用的任何对象都不是checked
  • 不会验证任何T-SQL代码的语法和类型检查
  • @SQL_STRING中的内容相对于SP
  • 而言属于自己的范围
  • 你可能会因为粗心大意而导致@SQL_STRING形成安全问题。
  • @SQL_STRING的查询计划将被缓存,但只有在后续EXEC(@SQL_STRING)与其完全匹配时才会重复使用,如果所有更改都是参数,则可以重复使用单个查询计划。

答案 1 :(得分:0)

差异:

  • 使用exec语句,您可以创建动态创建的执行查询,存储在变量中[在某些情况下必须使用它]。

答案 2 :(得分:0)

BOL的备注部分提供了许多有趣的信息,例如:

  

数据库上下文的更改仅限于最后   直到EXECUTE结束   声明。例如,在EXEC之后   在以下语句中运行,   数据库上下文是master。

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

答案 3 :(得分:0)

带有字符串文字的EXEC命令容易出错并且不安全(SQL注入),因为执行只会执行您提供的任何内容。

检查安全通知:http://msdn.microsoft.com/en-us/library/ms188332.aspx