为了账号安全,请及时绑定邮箱和手机立即绑定

sp_executesql返回多个输出参数

标签:
SQL Server

参考下面sp_executesql单个输出参数,@I变量为动态列名,列名后缀n或是c,为了比较更新前后值是否发生了变化,分别做了两次SELECT取值,程代码冗余和产生不容忽视性能的问题。:

5acf072c0001405b00110016.jpgView Code                 SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'n] FROM #inserted'
                EXECUTE sp_executesql @sql,
                                      N'@N DECIMAL(18,0) OUTPUT',
                                      @Nn OUTPUT;
                SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'n] FROM #deleted'        
                EXECUTE sp_executesql @sql,
                                      N'@O DECIMAL(18,0) OUTPUT',
                                      @On OUTPUT;    
                IF (ISNULL(@Nn,0) <> ISNULL(@On,0))                
                    --EXECUTE [dbo].[usp_Audit_Insert] ...                           
            
                
                SET @sql = N'SELECT @N = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #inserted'
                EXECUTE sp_executesql @sql,
                                      N'@N DECIMAL(18,0) OUTPUT',
                                      @Nc OUTPUT;
                SET @sql = N'SELECT @O = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #deleted'        
                EXECUTE sp_executesql @sql,
                                      N'@O DECIMAL(18,0) OUTPUT',
                                      @Oc OUTPUT;    
                IF (ISNULL(@Nc,0) <> ISNULL(@Oc,0))                
                    --EXECUTE [dbo].[usp_Audit_Insert] ...

 

sp_executesql可以实现返回多个输出参数,改进代码:

5acf072c0001405b00110016.jpgView Code DECLARE @sql NVARCHAR(MAX),@FName NVARCHAR(50)
                DECLARE @Nn DECIMAL(18,0),@On DECIMAL(18,0),@Nc DECIMAL(18,0),@Oc DECIMAL(18,0)    
                                
                SET @sql = N'SELECT @Nn = ['+ CONVERT(NVARCHAR(MAX),@I) +'n],@Nc = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #inserted'
                EXECUTE sp_executesql @sql,
                                      N'@Nn DECIMAL(18,0) OUTPUT,@Nc DECIMAL(18,0) OUTPUT',
                                      @Nn OUTPUT,@Nc OUTPUT;                                      
                                      
                SET @sql = N'SELECT @On = ['+ CONVERT(NVARCHAR(MAX),@I) +'n],@Oc = ['+ CONVERT(NVARCHAR(MAX),@I) +'c] FROM #deleted'        
                EXECUTE sp_executesql @sql,
                                      N'@On DECIMAL(18,0) OUTPUT,@Oc DECIMAL(18,0) OUTPUT',
                                      @On OUTPUT,@Oc OUTPUT;
                                          
                IF (ISNULL(@Nn,0) <> ISNULL(@On,0))
                    --EXECUTE [dbo].[usp_Audit_Insert] ...
                                
                IF (ISNULL(@Nc,0) <> ISNULL(@Oc,0))
                    --EXECUTE [dbo].[usp_Audit_Insert] ...

 

 更多相关:

http://www.cnblogs.com/insus/archive/2012/01/18/2325299.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消