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

相关文章

MySQL数据库约束深入详解

《MySQL数据库约束深入详解》:本文主要介绍MySQL数据库约束,在MySQL数据库中,约束是用来限制进入表中的数据类型的一种技术,通过使用约束,可以确保数据的准确性、完整性和可靠性,需要的朋友... 目录一、数据库约束的概念二、约束类型三、NOT NULL 非空约束四、DEFAULT 默认值约束五、UN

MySQL 多表连接操作方法(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN)

《MySQL多表连接操作方法(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLOUTERJOIN)》多表连接是一种将两个或多个表中的数据组合在一起的SQL操作,通过连接,... 目录一、 什么是多表连接?二、 mysql 支持的连接类型三、 多表连接的语法四、实战示例 数据准备五、连接的性

MySQL中的分组和多表连接详解

《MySQL中的分组和多表连接详解》:本文主要介绍MySQL中的分组和多表连接的相关操作,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录mysql中的分组和多表连接一、MySQL的分组(group javascriptby )二、多表连接(表连接会产生大量的数据垃圾)MySQL中的

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J

SpringBoot请求参数接收控制指南分享

《SpringBoot请求参数接收控制指南分享》:本文主要介绍SpringBoot请求参数接收控制指南,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring Boot 请求参数接收控制指南1. 概述2. 有注解时参数接收方式对比3. 无注解时接收参数默认位置

关于MongoDB图片URL存储异常问题以及解决

《关于MongoDB图片URL存储异常问题以及解决》:本文主要介绍关于MongoDB图片URL存储异常问题以及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录MongoDB图片URL存储异常问题项目场景问题描述原因分析解决方案预防措施js总结MongoDB图

Windows 上如果忘记了 MySQL 密码 重置密码的两种方法

《Windows上如果忘记了MySQL密码重置密码的两种方法》:本文主要介绍Windows上如果忘记了MySQL密码重置密码的两种方法,本文通过两种方法结合实例代码给大家介绍的非常详细,感... 目录方法 1:以跳过权限验证模式启动 mysql 并重置密码方法 2:使用 my.ini 文件的临时配置在 Wi

MySQL重复数据处理的七种高效方法

《MySQL重复数据处理的七种高效方法》你是不是也曾遇到过这样的烦恼:明明系统测试时一切正常,上线后却频频出现重复数据,大批量导数据时,总有那么几条不听话的记录导致整个事务莫名回滚,今天,我就跟大家分... 目录1. 重复数据插入问题分析1.1 问题本质1.2 常见场景图2. 基础解决方案:使用异常捕获3.

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http