用sp_executesql执行动态SQL语句及获得返回值

过去我执行拼凑出来的动态SQL语句,都直接使用EXEC @sql 的方式。有好几次,都看到有资料说,应该尽量使用 sp_executesql。

究其原因,是因为仅仅参数不同的情况下,sp_executesql可以重用执行计划,这不就有跟存储过程一样的优势了吗?同时,sp_executesql还可以提供动态SQL语句执行的返回值,方便得很。

但sp_executesql的使用方式看上去比较复杂,一点都不像EXEC那样直观。

用法:

EXEC sp_executesql SQL语句,参数声明,参数


	CREATE TABLE #tmp(t INT NOT NULL,it DECIMAL(18,4),pt DECIMAL(18,4));
	INSERT INTO #tmp(t,it,pt) VALUES(1,10.00,15.00);
	INSERT INTO #tmp(t,it,pt) VALUES(2,20.00,30.00);

	DECLARE @sql NVARCHAR(2000) = N'SELECT @it=it,@pt=pt FROM #tmp WHERE t=@tN;';
	DECLARE @Param NVARCHAR(500) = N'@tN INT,@it DECIMAL(18,4) OUTPUT,@pt DECIMAL(18,4) OUTPUT';
	DECLARE @tN INT,@it DECIMAL(18,4),@pt DECIMAL(18,4);
	
	SET @tN = 1;
	--@tN=@tN,第一个@tN是@Param里的声明,而第二个@tN则是外部的声明,其他类似
	EXEC sp_executesql @sql,@Param,@tN=@tN,@it=@it OUTPUT,@pt=@pt OUTPUT;
	SELECT @it,@pt;
	
	DROP TABLE #tmp;

为什么有返回值那么重要呢?我在不知道这个用法以前,如果需要捕捉动态SQL语句里的返回值,要借用表对象:

详见拙作:

http://blog.csdn.net/leftfist/article/details/12840785


declare @sql NVARCHAR(MAX) = N'SELECT @i,@j;';
declare @paramdefine NVARCHAR(MAX) = N'@i INT,@j INT,@k INT=3';
exec sp_executesql @sql,@paramdefine,@i=1,@j=2;



转载于:https://www.cnblogs.com/leftfist/p/4257929.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值