MS SQL 2008 にストアド プロシージャがあり、SSMS から呼び出された場合に完全に実行されます。リンク サーバーのテーブルに基づくビューからデータを取得し、このデータでローカル テーブルを更新します。そのため、現在、テスト中に 500 行を挿入し、約 13 秒かかり、SSMS は約 500 MB の RAM を消費するようになります (ただし、この時間とメモリのほとんどは、おそらくこのデータを画面に出力するために使用されます)。ただし、この手順を実行する php スクリプトを実行すると、2 ~ 3 秒しかかからず、94 行しか挿入されません。私はphp.iniで遊んでいましたが、まだ結果がありません。ここに私が更新した設定があります。
max_execution_time = 600
max_input_time = 600
memory_limit = 512M
これが私のコードです
ALTER PROCEDURE [dbo].[Update_emp]
-- Add the parameters for the stored procedure here
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @emp_no varchar(10),@emp_name varchar(100),@emp_short_name varchar(100),@emp_position varchar(100),@quit_date date
,@dept_id int;
--update c_emp_t table with current data from 1C server
DELETE dbo.c_emp_t;
INSERT INTO dbo.c_emp_t
SELECT *
FROM dbo.c_emp_v;
DECLARE emp_cursor CURSOR FOR
SELECT emp_no,emp_name,emp_short_name,emp_position,dept_id,quit_date FROM dbo.c_emp_t ORDER BY emp_no, quit_date;
--read emp data
OPEN emp_cursor
FETCH NEXT FROM emp_cursor INTO @emp_no,@emp_name,@emp_short_name,@emp_position,@dept_id,@quit_date
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT emp_no FROM dbo.emp_t WHERE emp_no = @emp_no;
IF @@ROWCOUNT>0
BEGIN
UPDATE dbo.emp_t SET emp_name = @emp_name, emp_short_name = @emp_short_name, emp_position = @emp_position, dept_id = @dept_id, quit_date = @quit_date WHERE emp_no = @emp_no;
END;
ELSE
BEGIN
INSERT INTO dbo.emp_t VALUES(@emp_no,@emp_name,@emp_short_name,@emp_position,'TPV',@dept_id,@quit_date);
END;
FETCH NEXT FROM emp_cursor INTO @emp_no,@emp_name,@emp_short_name,@emp_position,@dept_id,@quit_date
END
CLOSE emp_cursor
DEALLOCATE emp_cursor
END
そして、これはこの手順への私のphp呼び出しです
if(!empty($_REQUEST['import_from_1c']))
{
// $sql="{ call dbo.Update_dept }";
// $stmt = sqlsrv_query( $conn, $sql );
// if( $stmt == false)
// die( print_r( sqlsrv_errors(), true) );
// sqlsrv_free_stmt( $stmt);
$sql="{ call dbo.Update_emp }";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt == false)
die( print_r( sqlsrv_errors(), true) );
else
echo "Success</br>";
sqlsrv_free_stmt( $stmt);
}
ご覧のとおり、1 つのストアド プロシージャの呼び出しにコメントを付けました。ほとんど同じ考えですが、約 60 行しかなく、SSMS と PHP の両方で機能します。
IIS で PHP バージョン 5.3.27 TS VC9 を使用しています。
なぜそれが起こるのか、またはこの問題の根本を理解するために何ができるでしょうか?