使用sqlsrv驱动程序通过php调用无法正常运行存储过程

时间:2013-09-17 12:10:58

标签: php sql sql-server stored-procedures sqlsrv

我在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);
}   

正如你所看到的,我评论了对一个存储过程的调用 - 它几乎是相同的想法,但它只有大约60行,它在SSMS和PHP中都有效。

我在IIS上使用PHP版本5.3.27 TS VC9。

知道为什么会发生这种情况,或者我该如何找出问题的根源?

1 个答案:

答案 0 :(得分:0)

好的,通过论坛搜索并尝试了我能够找到解决方案的东西

$sql="{ call dbo.Update_emp }";
$stmt = sqlsrv_query( $conn, $sql );
if( $stmt == false)
    die( print_r( sqlsrv_errors(), true) );
while(sqlsrv_next_result($stmt))
{ 
    echo "Success</br>";
}

sqlsrv_free_stmt( $stmt);

这种方式有效!它插入我需要的所有500行