参考:
http://www.cnblogs.com/wanyuan8/archive/2011/11/09/2243483.html
http://www.cnblogs.com/xbf321/archive/2008/11/02/1325067.html
两种动态SQL
1. EXEC (@sql)
2. EXEC sp_executesql
性能:
sp_executesql提供了输入输出接口,更具有优势
sp_executesql根据参数重用执行计划,不需要每一次都重新编译,提高了执行性能; EXEC因为每次构建的@sql字符串不一样,必须重新编译
除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql
注意:(执行动态sql时候,防止sql注入攻击)
1. 使用EXEC(@sql)时,如果您想访问变量,必须把变量内容串联到动态构建的代码字符串中
declare @sql nvarchar(200) declare @id varchar(20) set @id='1' set @sql='select * from SMCN_CUList_China where Rownum_id = ' + @id exec (@sql)
2. sp_executesql后面跟有三部份,分别是 @stmt, @params, params_assignment
declare @sql nvarchar(200) declare @id varchar(20) declare @count int set @id='1' set @sql='select @count = count(1) from t_a where Rownum_id = @id' exec sp_executesql @sql, N'@count int out,@id varchar(20)',@count out,@id select @count
sp_executesql使用:
sp_executesql要求动态Sql (即@stmt部分) 和动态Sql参数列表 (即@params部分) 必须是Nvarchar
N'@count int out,@id varchar(20)' 是@stmt内的参数列表; @count out,@id 是为@params参数列表提供值的外部参数列表
sp_executesql 参数列表@params与外部提供值的参数列表params_assignment的顺序必需一致; 如果不一致,必须显式标明,如 @id=@id, @count=@count out
动态SQl的参数列表与外部提供参数的参数列表参数名可以同名