php呼叫sqlserver儲存過程例項,帶輸入輸出引數,經測試可用
阿新 • • 發佈:2019-01-05
因工作原因最近需要用到呼叫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;
}