请告诉我有什么区别 ==>如果我直接在storedprocedure中编写查询 ==>并在字符串变量中写入查询,然后在存储过程的exec中运行它。
我正在使用ms sql server 2005
答案 0 :(得分:2)
除了一些例外情况,EXEC('sql stmnt')
是您在没有其他选择时使用的。
它允许您动态构建语句并执行它,这通常是在对象名称可变且事先不知道时实现某些事情的唯一方法。
在动态SQL上阅读此article,它解释了动态SQL何时/为何有用的场景&详细了解EXEC()
。
至于在存储过程中运行SQL语句与在EXEC(@SQL_STRING)
过程中运行它之间的区别:
@SQL_STRING
中引用的任何对象都不是checked @SQL_STRING
中的内容相对于SP @SQL_STRING
形成安全问题。@SQL_STRING
的查询计划将被缓存,但只有在后续EXEC(@SQL_STRING)
与其完全匹配时才会重复使用,如果所有更改都是参数,则可以重复使用单个查询计划。答案 1 :(得分:0)
差异:
答案 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