1. 程式人生 > >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        -- 返回提示或錯誤資訊
	)
AS
	declare @SERVER varchar(500);
	declare @UID varchar(200);
	declare @PWD varchar(200);
BEGIN
	SET 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='
[email protected]
+';UID='[email protected]+';PWD='[email protected]+''', 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.SubCode WHERE Billtime>='''
[email protected]
+''' and EntGuid='''[email protected]+''' ) 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) ) BEGIN DECLARE @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 @tb1 WHERE 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) BEGIN IF (@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='''
[email protected]
_time+''' WHERE GOODSGUID='[email protected]+' AND BRANCHGUID='[email protected]+';'; END ELSE BEGIN --插入 DECLARE @RECORD_GUID VARCHAR(50)=NEWID(); IF ( ISNULL(@do_insert_sql, '') = '') BEGIN SET @do_insert_sql = @do_insert_sql+'SELECT '''[email protected]_GUID+''','''[email protected]+''','+CAST(CAST(@StockQuantity as INT) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','''[email protected]+''','''[email protected]+''','''[email protected]_time+''''; END ELSE BEGIN SET @do_insert_sql = @do_insert_sql+' UNION ALL SELECT '''[email protected]_GUID+''','''[email protected]+''','+CAST(CAST(@StockQuantity as INT) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','''[email protected]+''','''[email protected]+''','''[email protected]_time+''''; END END --讓遊標指向下一條記錄 FETCH next from STOCK_CURSOR into @SubCode,@ItemCode,@StockQuantity,@UnitPrice,@IS_EXISTS,@RECORD_NUM; END SET @i = @i+1; /***************************執行一遍更新或者插入語句*********************************/ IF(ISNULL(@do_update_sql, '') <> '') BEGIN exec sp_executesql @do_update_sql; --如果不關閉NOCOUNT這裡會影響輸出,因為他會返回影響的行數 IF @@ROWCOUNT = 0 OR @@ERROR<>0 BEGIN SELECT @ReturnMsg = 'update record error'; GOTO SQLERR1; END END IF(ISNULL(@do_insert_sql, '') <> '') BEGIN SET @do_insert_sql = 'INSERT INTO SHOP_BRANCH_STOCKCOUNT(GUID,ORGGUID,STOCKCOUNT,USERPRICE,MARKETPRICE,GOODSGUID,BRANCHGUID,UPDATETIME) '[email protected]_insert_sql; --如果不關閉NOCOUNT這裡會影響輸出,因為他會返回影響的行數 exec sp_executesql @do_insert_sql; IF @@ROWCOUNT = 0 OR @@ERROR<>0 BEGIN SELECT @ReturnMsg = 'insert record error'; GOTO SQLERR1; END END Commit Tran; --提交事務 --關閉遊標 CLOSE STOCK_CURSOR; --銷燬遊標 DEALLOCATE STOCK_CURSOR; END Set @ReturnMsg='success'; END ELSE BEGIN Set @ReturnMsg = 'data empty'; END SET NOCOUNT OFF; Set @ReturnValue='1'; return; /*************************************異常處理*********************************************************************/ SQLErr1: RollBack Transaction; Set @ReturnValue = '-1'; Return; END 方案2: CREATE PROCEDURE [dbo].[UPDATE_STOCK] ( @Updatetime varchar(50), --更新時間 @Orgguid varchar(50), --組織機構guid @ReturnMsg varchar(50) output, -- 返回提示或錯誤資訊 @ReturnValue varchar(50) output -- 返回提示或錯誤資訊 ) AS --因儲存過程中需要遠端連線其他資料庫所以需要以下引數 declare @SERVER varchar(500); --伺服器名稱 declare @UID varchar(200); --資料庫使用者名稱 declare @PWD varchar(200); --密碼 BEGIN SET NOCOUNT ON; --如果想只獲取輸出引數,而不被儲存過程裡面的exec影響則需加上該設定,關閉影響的行數才行* declare @NUM NUMERIC(10,0); --記錄個數 declare @per_page NUMERIC(10,0)=1000; --每頁記錄個數 SET @SERVER='192.168.100.2'; SET @UID='sq'; SET @PWD='testsql'; --遠端查詢庫存資訊 --獲取記錄的總個數 --這裡是遠端連線資料庫的操作部分* SELECT @NUM=COUNT(Guid) FROM OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.100.2;UID=sa;PWD=testsql', WeiShopDB_empty.dbo.i_EntSubInfoNew) AS a WHERE Billtime>[email protected] and [email protected]; DECLARE @i INT = 0; --迴圈計數 IF(@NUM > 0) BEGIN --迴圈查詢庫存記錄並進行更新,如果之前庫存已經存在則更新,否則插入 WHILE ( @i < CEILING(@NUM/@per_page) ) BEGIN Begin Tran;--開啟事務 DECLARE @do_insert_sql nvarchar(MAX) = ''; --最後執行的insert sql語句 DECLARE @do_update_sql nvarchar(MAX) = ''; --最後執行的update sql語句 DECLARE @fail_str VARCHAR(2000) = ''; --失敗的語句 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 @Guid VARCHAR(50),@GOODSGUID VARCHAR(50),@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 SCROLL for ( SELECT * FROM ( SELECT Guid,SubCode,ItemCode,ISNULL(StockQuantity, 0) StockQuantity,ISNULL(UnitPrice, 0) UnitPrice,sbs.GOODSGUID, case when ISNULL(sbs.GOODSGUID, 0)=0 then 0 else 1 end as IS_EXISTS,ROW_NUMBER() over (order by Billtime DESC) as NUM FROM OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.100.2;UID=sa;PWD=testsql', 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.SubCode WHERE Billtime>[email protected] and [email protected] ) t WHERE NUM BETWEEN @start_index AND @end_index ) --開啟遊標 OPEN STOCK_CURSOR; --開始循環遊標變數 FETCH next from STOCK_CURSOR into @Guid,@SubCode,@ItemCode,@StockQuantity,@UnitPrice,@GOODSGUID,@IS_EXISTS,@RECORD_NUM; WHILE (@@FETCH_STATUS =0) BEGIN IF (@IS_EXISTS = 1) BEGIN --更新 SET @do_update_sql = @do_update_sql+'UPDATE SHOP_BRANCH_STOCKCOUNT SET STOCKCOUNT='+CAST(CAST(@StockQuantity as INT) AS VARCHAR(50))+',USERPRICE='+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(50))+',MARKETPRICE='+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(50))+' WHERE GOODSGUID='[email protected]+' AND BRANCHGUID='[email protected]+';'; END ELSE BEGIN --插入 DECLARE @RECORD_GUID VARCHAR(50)=NEWID(); IF ( ISNULL(@do_insert_sql, '') = '') BEGIN SET @do_insert_sql = @do_insert_sql+'SELECT '[email protected]_GUID+','[email protected]+','+CAST(CAST(@StockQuantity as INT) AS VARCHAR(50))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(50))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(50))+','[email protected]+','[email protected]; END ELSE BEGIN SET @do_insert_sql = @do_insert_sql+' UNION ALL SELECT '[email protected]_GUID+','[email protected]+','+CAST(CAST(@StockQuantity as INT) AS VARCHAR(50))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(50))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(50))+','[email protected]+','[email protected]; END END --讓遊標指向下一條記錄 FETCH next from STOCK_CURSOR into @Guid,@SubCode,@ItemCode,@StockQuantity,@UnitPrice,@GOODSGUID,@IS_EXISTS,@RECORD_NUM; END SET @i = @i+1; /***************************執行一遍更新或者插入語句*********************************/ IF(ISNULL(@do_update_sql, '') <> '') BEGIN exec sp_executesql @[email protected]_update_sql; --如果不關閉NOCOUNT這裡會影響輸出,因為他會返回影響的行數* IF @@ROWCOUNT = 0 OR @@ERROR<>0 BEGIN SELECT @ReturnMsg = '更新門店庫存記錄失敗:SQL='[email protected]_update_sql; --GOTO SQLERR1; END END IF(ISNULL(@do_insert_sql, '') <> '') BEGIN SET @do_insert_sql = 'INSERT INTO SHOP_BRANCH_STOCKCOUNT(GUID,ORGGUID,STOCKCOUNT,USERPRICE,MARKETPRICE,GOODSGUID,BRANCHGUID) '[email protected]_insert_sql; --如果不關閉NOCOUNT這裡會影響輸出,因為他會返回影響的行數* exec sp_executesql @do_insert_sql; IF @@ROWCOUNT = 0 OR @@ERROR<>0 BEGIN SELECT @ReturnMsg = '插入門店庫存記錄失敗:SQL='[email protected]_insert_sql; --GOTO SQLERR1; END END Commit Tran; --提交事務 --關閉遊標 CLOSE STOCK_CURSOR; --銷燬遊標 DEALLOCATE STOCK_CURSOR; END END ELSE BEGIN SELECT @ReturnMsg = 'shujuweikong'; END SET NOCOUNT OFF; Set @ReturnMsg='操作成功'; Set @ReturnValue='1'; return; /*************************************異常處理*********************************************************************/ SQLErr1: RollBack Transaction; Set @ReturnValue = '-1'; Return; END 方案3:優化了方案2的一些內容 CREATE PROCEDURE [dbo].[UPDATE_STOCK] ( @Updatetime varchar(50), @Orgguid varchar(50), @ReturnMsg varchar(1000) output, -- 返回提示或錯誤資訊 @ReturnValue varchar(50) output -- 返回提示或錯誤資訊 ) AS declare @SERVER varchar(500); declare @UID varchar(200); declare @PWD varchar(200); BEGIN SET NOCOUNT ON; --如果想只獲取輸出引數,而不被儲存過程裡面的exec影響則需加上該設定,關閉影響的行數才行 declare @NUM NUMERIC(10,0); --記錄個數 declare @per_page NUMERIC(10,0) = 500; --每頁記錄個數,經測試每頁500個時間最快,而且超過1000多個好像就會出問題 DECLARE @temp VARCHAR(500); SET @SERVER='192.168.100.2'; SET @UID='sa'; SET @PWD='testsql'; --遠端查詢庫存資訊 --獲取記錄的總個數 SELECT @NUM=COUNT(Guid) FROM OPENROWSET('MSDASQL','DRIVER={SQL Server};SERVER=192.168.100.2;UID=sa;PWD=testsql', WeiShopDB_empty.dbo.i_EntSubInfoNew) AS a WHERE Billtime>[email protected] and [email protected]; DECLARE @i INT = 0; --迴圈計數 DECLARE @now_time VARCHAR(25) = CONVERT(varchar(25), GETDATE(), 21); --當前時間 IF(@NUM > 0) BEGIN --迴圈查詢庫存記錄並進行更新,如果之前庫存已經存在則更新,否則插入 WHILE ( @i < CEILING(@NUM/@per_page) ) BEGIN DECLARE @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 SCROLL for ( 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=192.168.100.2;UID=sa;PWD=testsql', 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.SubCode WHERE Billtime>[email protected] and [email protected] ) t WHERE 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) BEGIN IF (@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='''[email protected]_time+''' WHERE GOODSGUID='[email protected]+' AND BRANCHGUID='[email protected]+';'; END ELSE BEGIN --插入 DECLARE @RECORD_GUID VARCHAR(50)=NEWID(); IF ( ISNULL(@do_insert_sql, '') = '') BEGIN SET @do_insert_sql = @do_insert_sql+'SELECT '''[email protected]_GUID+''','''[email protected]+''','+CAST(CAST(@StockQuantity as INT) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','''[email protected]+''','''[email protected]+''','''[email protected]_time+''''; END ELSE BEGIN SET @do_insert_sql = @do_insert_sql+' UNION ALL SELECT '''[email protected]_GUID+''','''[email protected]+''','+CAST(CAST(@StockQuantity as INT) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','+CAST(CAST(@UnitPrice as NUMERIC(18,2)) AS VARCHAR(20))+','''[email protected]+''','''[email protected]+''','''[email protected]_time+''''; END END --讓遊標指向下一條記錄 FETCH next from STOCK_CURSOR into @SubCode,@ItemCode,@StockQuantity,@UnitPrice,@IS_EXISTS,@RECORD_NUM; END SET @i = @i+1; /***************************執行一遍更新或者插入語句*********************************/ IF(ISNULL(@do_update_sql, '') <> '') BEGIN exec sp_executesql @do_update_sql; --如果不關閉NOCOUNT這裡會影響輸出,因為他會返回影響的行數 IF @@ROWCOUNT = 0 OR @@ERROR<>0 BEGIN SELECT @ReturnMsg = 'update record error'; GOTO SQLERR1; END END IF(ISNULL(@do_insert_sql, '') <> '') BEGIN SET @do_insert_sql = 'INSERT INTO SHOP_BRANCH_STOCKCOUNT(GUID,ORGGUID,STOCKCOUNT,USERPRICE,MARKETPRICE,GOODSGUID,BRANCHGUID,UPDATETIME) '[email protected]_insert_sql; --如果不關閉NOCOUNT這裡會影響輸出,因為他會返回影響的行數 exec sp_executesql @do_insert_sql; IF @@ROWCOUNT = 0 OR @@ERROR<>0 BEGIN SELECT @ReturnMsg = 'insert record error'; GOTO SQLERR1; END END Commit Tran; --提交事務 --關閉遊標 CLOSE STOCK_CURSOR; --銷燬遊標 DEALLOCATE STOCK_CURSOR; END Set @ReturnMsg='success'; END ELSE BEGIN Set @ReturnMsg = 'data empty'; END SET NOCOUNT OFF; Set @ReturnValue='1'; return; /*************************************異常處理*********************************************************************/ SQLErr1: RollBack Transaction; Set @ReturnValue = '-1'; Return; END 下面是呼叫該儲存過程的php程式碼: //首先需要連線到遠端連線的資料庫開啟Ad Hoc Distributed Queries引數,我下面是其中的部分主要程式碼,框架用的ci框架 public function testCunchu($updatetime){ $config = array(); //資料庫配置選項 $db1 = $this->load->database($config,true); //開啟分散式查詢引數 $on_advanced = "exec sp_configure 'show advanced options',1"; $on_ad = "exec sp_configure 'Ad Hoc Distributed',1"; $off_ad = "exec sp_configure 'Ad Hoc Distributed',0"; $on_advanced = "exec sp_configure 'show advanced options',0"; $reconf = 'reconfigure'; $db1->query($on_advanced); $db1->query($reconf); $db1->query($on_ad); $db1->query($reconf); //呼叫儲存過程 $r = $this->doStoredProcedure($updatetime); //關閉分散式查詢引數 $db1->query($off_ad); $db1->query($reconf); $db1->query($off_advanced); $db1->query($reconf); } //呼叫儲存過程* public function doStoredProcedure($Updatetime){ $Orgguid = $_SESSION['orgguid'] //組織機構號 $this->load->mode('f_goods_model'); $this->f_goods_model->init_db(); $return = array(); $serverName = $this->db->hostname;//伺服器名稱 $connectionInfo = array( 'UID' => $this->db->username, //使用者名稱 'PWD' => $this->db->password, //密碼 'Database' => $this->db->database //資料庫名 ); $conn = sqlsrv_connect($serverName,$connectionInfo); if($conn == false) { $return = array( 'status' => 0, 'msg' =>'無法連線' ); return $return; } //呼叫儲存過程 $tsql_callSP = " begin declare @Updatetime varchar(50) = '".$Updatetime."'; declare @Orgguid varchar(50)='".$Orgguid."'; declare @ReturnMsg varchar(500); declare @ReturnValue varchar(500); exec dbo.UPDATE_STOCK @Updatetime,@Orgguid,@ReturnMsg output,@ReturnValue output; end "; $stmt3 = sqlsrv_query($conn,$tsql_callSP); if($stmt3 === false){ $return = array( 'status' => 0, 'msg' => '呼叫儲存過程錯誤' ); return $return; } while($row = sqlsrv_fetch_array($stmt3,SQLSRV_FETCH_ASSOC)){ $result = $row; } if(!empty($result)) { $return = array( 'status' => 1, 'msg' => $ReturnMsg ); }else{ $return = array( 'status' => 0, 'msg' => '出現錯誤' ); } //關閉釋放連線 sqlsrv_free_stmt($stmt3); sqlsrv_close($conn); return $return; }