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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Eureka集群环境搭建

    Eureka集群环境搭建前言:Eureka已经停止更新了,在新的项目中,不推荐使用,通过对周阳老师视频的学习,本篇文章主要是简单介绍下Eureka,以及如何搭建集群环境的Eureka,让大家对Eureka有个初步的了解。1.什么是EurekaEureka是Netflix开发的,一个基于REST服务的,服务注册与发现的组件,以实现中间层服务器的负载平衡和故障转移。它主要包括两个组件:EurekaServer和EurekaClientEurekaClient:一个Java

    2022年6月1日
    44
  • python数组转化为字符串类型_python字符串类型

    python数组转化为字符串类型_python字符串类型python字符串数组转对象类型importjsoncontent=”'[{“_1″:”唐”,”_2″:12},{“_1″:”宋”,”_2″:2},{“_1″:”元”,”_2″:45}][{“_1″:”明”,”_2″:2},{“_1″:”清”,”_2″:4},{“_1″:”夏”,”_2″:5}][{“_1″:”商”,”_2″:11},{“_1″:”周”,”_2″:1},{“_1″:”晋”,”_2″:7}]”’#因为是字符串数组,一个字符串里含有三个数组,而每个数组里的对象都是以“,”隔开,

    2025年9月16日
    13
  • vue django mysql_Python MySQL

    vue django mysql_Python MySQL工作之余断断续续根据网上找到的教程进行环境搭建,搭建了多个。但是一直没有一个整体概念,到底该先做什么,后做什么,操作一步后,结果应该是怎样另外,网上的教程都是直接用命令行操作,用pycharm又应该怎么弄呢环境搭建好以后,应该怎么分目录结构,应该先从哪里的代码开始写,写了以后,又需要做哪些配置这些问题一直困扰着我,所以我决定边学边记录整理。也希望能帮助同为初学者的你少走一些…

    2022年8月28日
    7
  • 良心推荐,我珍藏的一些Chrome插件[通俗易懂]

    良心推荐,我珍藏的一些Chrome插件[通俗易懂]上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的Chrome浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。我下面就把我日常工作和学习中经常用到的一些Chrome浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。MarkdownHereMarkdownHere可以让你更愉快的写邮件,由于支持Markdown直接转电子邮…

    2022年6月10日
    28
  • RabbitMQ原理分析

    RabbitMQ原理分析RabbitMQ 简介基于 AMQP 协议实现 主要作用是解耦 冗余 扩展性 增大消息入队和处理的频率变得很容易 平滑峰值 可恢复性 送达保证 ACK 机制消费者消费消息后必须返回相应的 ACK 顺序保证等 文章当中使用的 RabbitMQ 的版本是 RabbitMQ3 6 6 关键概念 Exchange 交换机启动 RabbitMQ 相关的服务 会默认创建一个不可以删除的 Excha

    2025年6月8日
    4
  • android 骨骼动画教程,使用DragonBones开发FLASH骨骼动画入门教程

    android 骨骼动画教程,使用DragonBones开发FLASH骨骼动画入门教程转载自:http://dragonbones.github.io/getting_started_cn.htmlDragonBones快速入门指南DragonBones快速入门指南采用知识共享协议3.0版本。目录DragonBones是什么?DragonBones是一套开源的2D骨骼动画框架和工具,它包含了基于FlashPro的骨骼动画编辑面板DragonBonesDesignPanel及骨骼…

    2022年6月11日
    29

发表回复

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

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