sqlserver 动态sql执行execute和sp_executesql

sqlserver 动态sql执行execute和sp_executesqlsqlserver动态sql的执行,有两个方法execute和sp_executesql.其中第一个方法execute可以简写为exec.execute方法适合执行没有返回值的动态sql,sp_executesql可以获取到动态sql的返回值.二者比较起来,前者写起来简单,后者功能强大些,但写起来麻烦,使用的时候具体情况具体分析吧.  在function中不能使用exec和sp_exec

大家好,又见面了,我是你们的朋友全栈君。

  sqlserver 动态sql的执行,有两个方法execute和 sp_executesql.其中第一个方法execute可以简写为exec. execute方法适合执行没有返回值的动态sql,sp_executesql可以获取到动态sql的返回值.二者比较起来,前者写起来简单,后者功能强大些,但写起来麻烦,使用的时候具体情况具体分析吧.
  在function 中不能使用exec和sp_executesql,但是存储过程中可以使用
  1. execute 的运用

--1.查@psn_code 的申请数量
--但是我们没有在变量中得到数量为多少,只是在查询结果中看到的改数据.
declare @sql nvarchar(2000);
DECLARE @psn_code NVARCHAR(100);
SET @psn_code = 774;
set @sql='select count(*) from proposal where psn_code='+@psn_code;
EXECUTE(@sql);

  2. sp_executesql的运用
  书写语法要点:
  exec sp_executesql @sql,N’参数1 类型1,参数2 类型2,参数3 类型3 OUTPUT’,参数1,参数2,参数3 OUTPUT;
  注意参数前后顺序必须对应好 如下图不同颜色的标记
  这里写图片描述
  
例1

---书写规则
---exec sp_executesql @sql,N'参数1 类型1,参数2 类型2,参数3 类型3 OUTPUT',参数1,参数2,参数3 OUTPUT;
---注意参数顺序必须对应好,习惯上把OUTPUT 参数放在最后
DECLARE @sql NVARCHAR(1000);
DECLARE @tableName NVARCHAR(100);
DECLARE @count INT;
DECLARE @psn_code NVARCHAR(100);
DECLARE @form_code NVARCHAR(100);

SET @psn_code = '774';
SET @form_code = '10005';

set @sql=N'select @count=count(1) from proposal where psn_code= @psn_code and form_code=@form_code';
exec sp_executesql @sql,N'@psn_code NVARCHAR(100),@form_code NVARCHAR(100),@count int OUTPUT',@psn_code,@form_code,@count OUTPUT;
print @count;

这里写图片描述

  在测试过程中,将表名也使用参数绑定去发现错误.脚本如下
  
反例2

--动态查出每个表中有多少条数据
DECLARE @sql NVARCHAR(1000);
DECLARE @tableName NVARCHAR(100);
DECLARE @count INT;
DECLARE @psn_code NVARCHAR(100);
DECLARE @status NVARCHAR(5);

SET @tableName = 'PROPOSAL';
SET @psn_code = '774';
SET @status = '90';

set @sql=N'select @count=count(1) from @tableName where psn_code= @psn_code and status = @status';
--注意这里表名不能是动态的参数,否则报错. 
--参数列表:N'参数1,参数2,参数3 OUTPUT',参数1,参数2,参数3 OUTPUT 前后顺序一定要对的上
EXEC sp_executesql @sql,N'@tableName NVARCHAR(100),@psn_code NVARCHAR(100),@status NVARCHAR(5),@count int output',@tableName,@psn_code,@status,@count OUTPUT;
print @count;

  错误信息如下,暂未找到原因
  这里写图片描述
  

为了解决上面的问题,只能曲线救国了.使用字符串拼接来完成.
例3

--动态查出每个表中有多少条数据
DECLARE @sql NVARCHAR(1000);
DECLARE @tableName NVARCHAR(100);
DECLARE @count INT;
DECLARE @psn_code NVARCHAR(100);
DECLARE @status NVARCHAR(5);

SET @tableName = 'PROPOSAL';
SET @psn_code = '774';
SET @status = '90';

set @sql=N'select @count=count(1) from '+@tableName+ ' where psn_code= @psn_code and status = @status';
--参数列表:N'参数1,参数2,参数3 OUTPUT',参数1,参数2,参数3 OUTPUT 前后顺序一定要对的上
EXEC sp_executesql @sql,N'@psn_code NVARCHAR(100),@status NVARCHAR(5),@count int output',@psn_code,@status,@count OUTPUT;
print @count;

例4: 参数既是入参,也是返回值
此例中会用到自定义函数FN_GETXML ,该函数获取一个简单的XML. 点击FN_GETXML函数获取 此文章开头定义了改函数

--动态修改xml 串里面的一个节点的值
DECLARE @sql NVARCHAR(4000);
DECLARE @xml XML;
DECLARE @xml2 XML;
DECLARE @node NVARCHAR(4000);
DECLARE @value NVARCHAR(4000);
SET @node= '(data/budget_list[1]/PrpManpowers/PrpManpower[1]/ename/text())[1] ';
SET @value = '11111111';
SET @xml = dbo.FN_GETXML();
---@xml 作为in/output
SET @sql = 'SET @xml.modify(''replace value of '+@node +' with "'+@value+'"'''+');';
EXECUTE sp_executesql @sql,N'@xml xml OUTPUT',@xml OUTPUT;
SELECT @xml;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143252.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 小企鹅输入法

    小企鹅输入法

    2021年7月30日
  • ftp上传工具如何下载和使用像详细教程

    ftp上传工具如何下载和使用像详细教程在学习网站搭建的过程中,我们必定会用到ftp上传工具,那么ftp工具是什么呢,我们该如何下载和使用呢?FTP(FileTransferProtocol),简称是文件传输的协议,我们可以用这个协议在互联网上做文件的双向传输,让我们用自己的计算机,可以链接到世界各地具有文件传输协议的ftp服务器进行连接,从而可以访问,传输下载大量的共享文件。同样我们可以从网站空间服务器中下载拷贝需要的文件到自己的…

    2022年5月22日
  • phpstorm 官方给的永久激活码2021【注册码】

    phpstorm 官方给的永久激活码2021【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
  • linux搭建svn服务器客户端_搭建web服务器的步骤

    linux搭建svn服务器客户端_搭建web服务器的步骤Linux搭建SVN服务器

    2022年4月21日
  • 微商分销系统哪家好,要怎么做?

    微商分销系统哪家好,要怎么做?分销模式的本质是分享经济,wemall微商分销系统将传统商品高昂的推广费用让利给消费者,并抽取一定金额作为分销商的佣金。分销模式使消费者直接与商家沟通,增加用户粘性,促成品牌的口碑转化为流量,相比与零售,分销有着无可比拟的优势,这也使越来越多的微商分销系统涌现出来。微信封杀分…

    2022年5月17日
  • java random函数原理_详解JAVA中Random()函数的用法

    java random函数原理_详解JAVA中Random()函数的用法有时候,我们会用到随机数。java中自带的Random()函数让我们可以很方便的产生随机数。本文介绍它的一些用法。随机数是专门的随机试验的结果。在统计学的不同技术中需要使用随机数,比如在从统计总体中抽取有代表性的样本的时候,或者在将实验动物分配到不同的试验组的过程中,或者在进行蒙特卡罗模拟法计算的时候等等。产生随机数有多种不同的方法。这些方法被称为随机数发生器。随机数最重要的特性是:它所产生的后面…

    2022年5月10日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号