存储过程和T-SQL的区别是服务器端是否会对执行计划进行缓存,即每次是否都需要对于要执行的内容重新编译,这不仅仅取决于是存储过程还是T-SQL,还取决于你语句中对参数的使用方式。
示例如下:
1、直接使用T-SQL语句
select top 100 * from A
where month_id=200901
month_id值发生变化时,需要重新编译。
2、直接使用的常量参数
CREATE PROC P_Exec1
@month_id INT
AS
select top 100 * from A
where month_id=@month_id
--EXEC P_Exec 200902
执行计划被缓存,参数值发生变化时,不需要重新编译。
3、使用EXEC执行动态定义的T-SQL语句
DECLARE @month_id INT
DECLARE @sql VARCHAR(4000)
SET @month_id=200901
SET @sql=' select top 100 * from A
where month_id='+CAST(@month_id AS VARCHAR)
EXEC (@sql)
@month_id值发生变化时,需要重新编译。
4、使用sp_executesql执行动态定义的T-SQL语句
EXEC sp_executesql
N' select top 100 * from A
where month_id=@month_id',
N'@month_id int',@month_id=200901
执行计划被缓存,参数值发生变化时,不需要重新编译。
5、将动态定义的T-sql语句放入存储过程
CREATE PROC P_Exec
@month_id INT
AS
DECLARE @sql VARCHAR(4000)
SET @sql=' select top 100 * from A
where month_id='+CAST(@month_id AS VARCHAR)
EXEC (@sql)
--EXEC P_Exec 200901
@month_id值发生变化时,需要重新编译。
具体的测试数据请自行创建。
结论:考虑到查询计划的重用性,相同定义的存储过程优于查询语句,sp_executesql优于exec()。