Моя проблема, когда я пытаюсь выполнить хранимую процедуру SQL через скрипт PHP, я столкнулся с потерей данных. Но когда я запускаю тот же SP в SQL Server Management Studio, не возникает никаких проблем или потери данных.
Я пытался увеличить свой SQL SP, и я также пытался увеличить время выполнения удаленного SQL на моем сервере. но проблема все еще там.
Я использую два курсора.
Когда хранимая процедура запускается через SQL Server Management Studio, никаких проблем не возникает.
SQL Server 2008 R2
PHP V5.6
Мне нужно решение для улучшения моей хранимой процедуры SQL или увеличения времени удаленного выполнения SQL.
PHP скрипт
if(isset($_POST['date1'])){
$callSP = "{call SP_SelectAllEmployeeOperationDetails(?,?)}";
$params = array(
array($_POST['date1'], SQLSRV_PARAM_IN),
array($_POST['date2'], SQLSRV_PARAM_IN)
);
$stmt = sqlsrv_query( $conn, $callSP, $params, array("QueryTimeout" => 900000));
if( $stmt === false ){
echo "Error in executing statement 3.\n";
die( print_r( sqlsrv_errors(), true));
}
sqlsrv_free_stmt($stmt);
}
SQL SP
USE [ServiceMasterN]
GO
/****** Object: StoredProcedure [dbo].[SP_SelectAllEmployeeOperationDetails] Script Date: 10/05/2018 09:02:20 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--execute SP_SelectAllEmployeeOperationDetails '2018-10-01', '2018-10-01'
ALTER PROCEDURE [dbo].[SP_SelectAllEmployeeOperationDetails]
@DateFrom varchar (20),
@DateTo varchar (20)
as
BEGIN
DELETE FROM [TempEmpWiseBayWiseActivities]
DELETE FROM [TempOperationDetails1]
DECLARE @EmpCode varchar(10)
DECLARE @Cur1 as CURSOR;
SET @Cur1 = CURSOR FAST_FORWARD FOR
SELECT Emp_code FROM BaywiseEmployee
OPEN @Cur1;
FETCH NEXT FROM @Cur1 INTO @EmpCode;
WHILE @@FETCH_STATUS = 0
BEGIN
--PRINT 'Processing ClientID: ' + Cast(@EmpCode as Varchar);
DECLARE @Bay char(4)
DECLARE @Cur2 as CURSOR;
SET @Cur2 = CURSOR FAST_FORWARD FOR
SELECT BaCode FROM Bay WHERE BaCode<>00
OPEN @Cur2;
FETCH NEXT FROM @Cur2 INTO @Bay;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO [TempOperationDetails1]
([EmpCode],[BayCode],[Count],[FromDate],[ToDate])
SELECT @EmpCode,@Bay,COUNT(*),@DateFrom,@DateTo
FROM JobActivityWiseEmployee INNER JOIN
JobHeader ON JobActivityWiseEmployee.JobNo = JobHeader.JobNo
WHERE (JobHeader.JobDate BETWEEN @DateFrom AND @DateTo)
GROUP BY JobActivityWiseEmployee.BaCode, JobActivityWiseEmployee.Emp_code
HAVING (JobActivityWiseEmployee.BaCode = @Bay) AND (JobActivityWiseEmployee.Emp_code = @EmpCode)
FETCH NEXT FROM @Cur2 INTO @Bay;
END;
CLOSE @Cur2;
DEALLOCATE @Cur2;
FETCH NEXT FROM @Cur1 INTO @EmpCode;
END;
CLOSE @Cur1;
DEALLOCATE @Cur1;
END
Задача ещё не решена.
Других решений пока нет …