分享两种执行动态的sql语句命令,分别是EXEC和sp_executesql、sp_executesql更有优势提供了输入输出接口,而EXEC没有,并且sp_executesql还可以重写执行计划,这样大大的提高了执行性能,还可以编写更安全的代码。
1.Exec的用法
两种命令 执行存储过程和执行动态批处理
DECLARE @exesql nvarchar(1000),@id nvarchar(100)
set @id='1';
set @exesql='select * from dbo.tb_UserInfo where id='+@id
exec(@exesql)
exec括号中只允许包含一个字符串变量但是可以串联多个变量例如(exec(@sql1+@sql2))
exec 没执行一次都要产生一次编译,执行计划没有得到充分重写
exec除了不支持动态处理中输入参数外,也不支持输出参数,默认情况下exec把查询输出返回值给调用者,例如下面返回表中所有记录条数
DECLARE @exesql nvarchar(1000),@id nvarchar(100),@pageCount
set @id='1';
set @exesql='select count(*) from dbo.tb_UserInfo where id='+@id
exec(@exesql)
CREATE TABLE #T(TID INT);
INSERT INTO #T EXEC(@sql);
SET @pageCount= (SELECT TID FROM #T)
SELECT @pageCount
DROP TABLE #T
2.sp_executesql的使用
DECLARE @exesql nvarchar(1000),@id nvarchar(100)
set @id='1';
set @exesql='select * from dbo.tb_UserInfo where id='+@id
exec sp_executesql @exesql //修改此处
sp_executesql 提供接口
sp_executesql
命令比EXEC命令更灵活,因为它提供一个接口,该接口及支持输入参数也支持输出参数。这功能使你可以创建带参数的查询 字符串,
这样就可以比EXEC更好的重用执行计划,sp_executesql的构成与存储过程非常相似,不同之处在于你是动态构建代码。它的构成包括:
代码快,参数声明部分,参数赋值部分。说了这么多,还是看看它的语法吧
EXEC sp_executesql
@stmt = <statement>,--类似存储过程主体
@params = < params>, --类似存储过程参数部分
< params assignment> --类似存储过程调用
@stmt
参数是输入的动态批处理,它可以引入输入参数或输出参数,和存储过程的主体语句一样,只不过它是动态的,而存储过程是静态的,不过你也可以在存储过程中使用
sp_executesql;
@params
参数与定义输入/
输出参数的存储过程头类似,实际上和存储过程头的语法完全一样;
@ 与调用存储过程的EXEC部分类似。
DBCC FREEPROCCACHE 情况缓存中的执行计划
3.参数赋值
delacre @sqlWhere nvarchar(1000)
@sqlWhere='where 1=1' 这样变量不需要初始化
@sqlWhere +='and 2=2' 追加赋值变量需要初始化