php调用sqlserver存储过程实例,带输入输出参数,经测试可用

本文主要是介绍php调用sqlserver存储过程实例,带输入输出参数,经测试可用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

因工作原因最近需要用到调用sqlserver存储过程,并且需要输入输出参数,因为单纯的参考网上的一些例子总有问题,最后自己解决后决定写一写解决的过程。并把自己写的3个方案都放上,记录一下自己的思路过程,经测试方案1为最优方案,性能比方案2,方案3,在10万数量级快6倍左右。

首先存储过程如下(其中带*的需要注意):


方案1:
CREATE PROCEDURE [dbo].[UPDATE_STOCK](@Updatetime  varchar(50),@Orgguid  varchar(50),@ReturnMsg    varchar(1000) output,         -- 返回提示或错误信息@ReturnValue    varchar(50) output        -- 返回提示或错误信息)
ASdeclare @SERVER varchar(500);declare @UID varchar(200);declare @PWD varchar(200);
BEGINSET NOCOUNT ON; --如果想只获取输出参数,而不被存储过程里面的exec影响则需加上该设置,关闭影响的行数才行declare @NUM NUMERIC(10,0); --记录个数declare @per_page NUMERIC(10,0) = 500; --每页记录个数,经测试每页500个时间最快,而且超过1000多个好像就会出问题DECLARE @temp VARCHAR(500);DECLARE @dosql NVARCHAR(1000);SET @SERVER='192.168.100.2';SET @UID='sa';SET @PWD='testsql';--定义表变量(******)DECLARE @tb1 Table(SubCode VARCHAR(50),ItemCode VARCHAR(50),StockQuantity NUMERIC(18,4),UnitPrice NUMERIC(18,6),IS_EXISTS INT,NUM INT);--远程查询库存信息(******)SET @dosql = 'SELECT SubCode,ItemCode,StockQuantity,UnitPrice,IS_EXISTS,NUM FROM (SELECT a.SubCode,a.ItemCode,ISNULL(StockQuantity, 0) StockQuantity,ISNULL(UnitPrice, 0) UnitPrice,case when ISNULL(sbs.GOODSGUID, 0)=0 then 0 else 1 end as IS_EXISTS,ROW_NUMBER() over (order by UnitPrice ASC) as NUM FROM OPENROWSET(''MSDASQL'',''DRIVER={SQL Server};SERVER='+@SERVER+';UID='+@UID+';PWD='+@PWD+''',WeiShopDB_empty.dbo.i_EntSubInfoNew) AS a LEFT JOIN (SELECT GOODSGUID,BRANCHGUID,ORGGUID FROM SHOP_BRANCH_STOCKCOUNT sbs1 GROUP BY GOODSGUID,BRANCHGUID,ORGGUID) sbs ON sbs.GOODSGUID=a.ItemCode AND sbs.ORGGUID=a.EntGuid AND sbs.BRANCHGUID=a.SubCodeWHERE Billtime>='''+@Updatetime+''' and EntGuid='''+@Orgguid+''') t';INSERT into @tb1 EXEC(@dosql); --插入表变量 (******)--获取记录的总个数SELECT @NUM = count(SubCode) from @tb1;DECLARE @i INT = 0; --循环计数DECLARE @now_time VARCHAR(25) = CONVERT(varchar(25), GETDATE(), 21); --当前时间IF(@NUM > 0)BEGIN--循环查询库存记录并进行更新,如果之前库存已经存在则更新,否则插入WHILE ( @i < CEILING(@NUM/@per_page) )BEGINDECLARE @do_insert_sql nvarchar(MAX) = ''; --最后执行的insert sql语句DECLARE @do_update_sql nvarchar(MAX) = ''; --最后执行的update sql语句DECLARE @start_index INT = @i*CAST(@per_page AS INT)+1; --开始的索引值DECLARE @end_index INT = CAST(@start_index as INT)+CAST(@per_page AS INT)-1; --结束的索引值DECLARE @SubCode VARCHAR(50),@ItemCode VARCHAR(50),@StockQuantity NUMERIC(18,4),@UnitPrice NUMERIC(18,6),@IS_EXISTS INT,@RECORD_NUM INT;DECLARE STOCK_CURSOR CURSOR LOCAL for (SELECT SubCode,ItemCode,StockQuantity,UnitPrice,IS_EXISTS,NUM FROM @tb1WHERE NUM BETWEEN @start_index AND @end_index)Begin Tran;--开启事务--打开游标OPEN STOCK_CURSOR;--开始循环游标变量FETCH next from STOCK_CURSOR into @SubCode,@ItemCode,@StockQuantity,@UnitPrice,@IS_EXISTS,@RECORD_NUM;WHILE (@@FETCH_STATUS =0)BEGINIF (@IS_EXISTS = 1)BEGIN--更新SET @do_update_sql = @do_update_sql+'UPDATE SHOP_BRANCH_STOCKCOUNT SET STOCKCOUNT='+CAST(CAST(@StockQuantity as INT) AS VARCHAR(20))+',USERPRICE='+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+',MARKETPRICE='+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+',UPDATETIME='''+@now_time+''' WHERE GOODSGUID='+@ItemCode+' AND BRANCHGUID='+@SubCode+';';ENDELSEBEGIN--插入DECLARE @RECORD_GUID VARCHAR(50)=NEWID();IF ( ISNULL(@do_insert_sql, '') = '')BEGINSET @do_insert_sql = @do_insert_sql+'SELECT '''+@RECORD_GUID+''','''+@Orgguid+''',&

这篇关于php调用sqlserver存储过程实例,带输入输出参数,经测试可用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/947277

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

前端原生js实现拖拽排课效果实例

《前端原生js实现拖拽排课效果实例》:本文主要介绍如何实现一个简单的课程表拖拽功能,通过HTML、CSS和JavaScript的配合,我们实现了课程项的拖拽、放置和显示功能,文中通过实例代码介绍的... 目录1. 效果展示2. 效果分析2.1 关键点2.2 实现方法3. 代码实现3.1 html部分3.2

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd