execute:相信大家都用的用熟了,简写为exec,除了用来执行存储过程,一般都用来执行动态Sql;
sp_executesql:sql2005中引入的新的系统存储过程,也是用来处理动态sql的,如:
exec sp_executesql @sql, N'@count int out,@id varchar(20)', @cou out, @id
-- @sql 为拼成的动态sql
-- N'@count int out,@id varchar(20)' 为拼成的动态sql内的参数列表
-- @cou out,@id 为动态sql内参数列表提供值的外部参数列表

那么它们之间有什么区别呢?

1,它们之间最大的区别是嵌入式的参数,如下面一个语句

declare @sql nvarchar(2000)
declare @id varchar(20)
set @id='1'
set @sql='select count(*) from emp where id=' + @id
exec @sql
我想把得到的count(*)传出来,用传统的exec是不好办到的,但是用sp_executesql则很容易就办到了:

DECLARE @sql NVARCHAR(2000)
DECLARE @count INT
DECLARE @id INT
SET @id = 789
SET @sql = 'select @count=count(1) from dbo.prm_batch_point where ​​​batch_id=@batchId'​​​
EXEC sp_executesql @sql, ​​​N'@count​​​ int OUT,@batchId int', @count OUT, @id
PRINT @count

2.性能
可以看到,如果用exec,由于每次传入的@id不一样,所以每次生成的@sql就不一样,这样每执行一次 Sql2005必须重新将要执行的动态Sql重新编译一次;
但是sp_executesql则不一样,由于将数值参数化,要执行的动态Sql永远不会变化,只是传入的参数的值在变化,那每次执行的时候就无需重新编译,速度自然快多了哈!

注意:
1. sp_executesql要求动态Sql和动态Sql参数列表必须是NVarchar,比如上个例子的@sql,​​​N'@count​​ int OUT,@batchId int'

2. 动态Sql的参数列表与外部提供值的参数列表顺序必需一致,如果不一致,必须显式标明,如:
N'@count int OUT,@batchId varchar(20)', @batchId=@id, @count=@count OUT

一旦使用了 ​​'@name​​​ = value' 形式之后,所有后续的参数就必须以 ​​'@name​​​ = value' 的形式传递。
3.动态SQl的参数列表与外部提供参数的参数列表参数名可以同名