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;
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • android缩放动画中心缩放_安卓动画缩放调到多少比较好

    android缩放动画中心缩放_安卓动画缩放调到多少比较好什么是ScaleAnimationScaleAnimation即缩放动画,应用场景特别多,比如常见的隐藏菜单点击显示下面我分两种方式来介绍ScaleAnimation如何使用。1.xml文件形式文件名:anim_scale_in.xml效果:呈现view放大显示效果源码:<?xmlversion=”1.0″encoding=”utf-8″?><setxmlns:android=”http://schemas.android.com/apk/res/

    2022年10月15日
  • redis-cli sentinel_redis sentinel配置

    redis-cli sentinel_redis sentinel配置RedisClient是一款纯java开发的开源客户端,原版本:https://github.com/caoxinyu/RedisClient,作者目前已经基本不再维护,最近想要使用一下,结果发现已经开始各种异常。应该是很久没更新的缘故。由于我们公司使用的哨兵模式,而且查看客户端的jedis版本确实有些古老并且发现使用的是单机版的Jedis,难怪会出现异常。例如:ERRunknowncomma…

    2022年10月12日
  • gtest宏列表_指定宏怎么用

    gtest宏列表_指定宏怎么用简介总结gtest中的所有断言相关的宏。gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:ASSERT_*系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。EXPECT_*系列的断言,当检查点失败时,继续往下执行。布尔值检查FatalassertionNonfatalassertion…

  • PHP 获得当前页面所有变量常量的值

    PHP 获得当前页面所有变量常量的值

  • 怎么提高网站访问速度_如何优化页面加载速度

    怎么提高网站访问速度_如何优化页面加载速度网站的加载速度不仅影响着用户体验,也会影响搜索引擎的排名,在百度推出“闪电算法”以来,将网站首屏打开速度被列入优化排名行列,并明确指定打开时间为2秒。作为前端开发的我们需要如果来优化网站的打开速度

  • 免费的ASP.NET AJAX 培训

    免费的ASP.NET AJAX 培训  好久没有写blog了,在这里感慨一下先 ;-))  最近BradAbrams 做了个关于ajax的E-Learning ,内容通俗易懂,估计这个教程2个小时可以完成。在学Ajax的朋友不妨看一下;点击here ,关于这个elearning的详细信息FreeASP.NETAJAXOnlineTraining在这里也郁闷一下,在asp.netajax1.0中列表

发表回复

您的电子邮箱地址不会被公开。

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