动态sql

动态SQL可以通过EXECUTE 或SP_EXECUTESQL这两种方式来执行

execute:
可执行 系统存储过程,用户自定义存储过程,标量值用户定义函数,扩展存储过程
sp_executesql:
执行多次重复使用或者动态生成的sql语句或者批处理,sql语句可以包含嵌入参数
在批处理,名称作用域或者数据库上下文中,sp_executesql 和 execute的行为相同,。

前者比后者方便些,比如执行动态sql字符串是varchar类型,不是nvarchar类型,后者只能执行是Unicode的字符串,或者可以隐转换为ntext的常量或变量,execute则两种类型的字符串都能执行

EXECUTE (N'SELECT * FROM Groups') --执行成功
EXECUTE ('SELECT * FROM Groups') --执行成功

SP_EXECUTESQL N'SELECT * FROM Groups'; --执行成功
SP_EXECUTESQL 'SELECT * FROM Groups' --执行出错

总结下:EXECUTE 可以执行非Unicode或Unicode类型的字符串常量、变量。而SP_EXECUTESQL只能执行Unicode或可以隐式转换为ntext的字符串常量、变量。


EXECUTE 括号里面只能是字符串变量、字符串常量、或它们的连接组合,不能调用其它一些函数、存储过程等。 如果要使用,则使用变量组合,


EXEC SP_EXECUTESQL @Sql, N'@GroupName NVARCHAR',@GroupName
查询出来没有结果,因为没有声明参数长度。


动态批处理不能访问定义在批处理里的局部变量 。 SP_EXECUTESQL 可以有输入输出参数,比EXECUTE灵活。

 

SELECT cacheobjtype, objtype, usecounts, sql
FROM sys.syscacheobjects
WHERE sql NOT LIKE '%cache%'
AND sql NOT LIKE '%sys.%';


前者每次执行生成一个执行计划,然后再执行,后者只生成一次,但会重复使用,所以后者比前者效率高

posted @ 2016-06-15 15:55  那就让我这样吧  阅读(203)  评论(0编辑  收藏  举报