从php执行MSSQL存储过程


Executing MSSQL stored procedure from php

我试图调用MS SQL存储过程形式php。

我已经在管理工作室中使用硬编码参数测试了存储过程本身,并能够使其以预期的结果执行。

然而,当尝试从php调用它时,我得到这些错误。

警告:mssql_execute() [function。msssql -execute]: C:'xampp'htdocs'index.php第145行存储过程执行失败

致命错误:C:'xampp'htdocs'index.php的最大执行时间超过60秒

在我发布的代码第145行是mssql_execute命令。

任何帮助都将是感激的。

    $userQuery = "select top 1 id from bravo_biometric_batch order by id desc";
    $result = mssql_query($userQuery,$DB);
    $bravo_biometric_batch_id = mssql_result($result,0,0);
    $company_year_id = 237;
    $date = date("Ymd");
    $server_file_name = "e:''bravo_csv''".$filename;
    $csv_proc_name = mssql_init('bulk_insert_bravo_csv',$DB);
    mssql_bind($csv_proc_name, '@data_csv_file',$server_file_name,SQLVARCHAR, false,false,200);
    mssql_bind($csv_proc_name, '@bravo_biometric_batch_id',$bravo_biometric_batch_id, SQLINT2, false,false, 10);
    mssql_bind($csv_proc_name, '@company_year_id',$company_year_id, SQLINT2, false,false,10);
    mssql_bind($csv_proc_name, '@upload_date',$date, SQLVARCHAR, false,false,20);
    mssql_execute($csv_proc_name); 

错误提示您的存储过程运行时间超过60秒。默认情况下,PHP超时时间为60秒(在PHP .ini中使用mysql.connect_timeout以秒为单位设置)

您应该尝试在SQL Query Analyzer中使用与超时时间相同的值手动运行该过程,并查看需要多长时间。例如,如果服务器上的文件是c:'temp'csvfile.csv,批标识为1234,公司年份为2011,日期为当前时间,则使用:

print 'Start time: ' + getdate()
exec 'bulk_insert_bravo_csv' 'c:''temp''csvfile.csv', 1234, 2011, getdate()
print 'End time: ' + getdate()

请注意,当您在查询分析器中运行SQL时,任何'字符都必须转义为'。

这将运行相同的命令,并打印前后的时间。然后你可以看到它花了多长时间。如果您不确定要使用的值,请让PHP页面在mysql_execute()命令之前将它们打印出来,然后将它们插入查询分析器中。

当您知道需要多长时间时,您可以将过程的超时调整为超过60秒。另一种方法是优化存储过程(如果可能),或者运行较小的CSV批处理。请注意,在增加60秒查询超时后,可能会遇到其他超时。例如,PHP本身将在PHP.ini中的max_execution_time中设置超时。Apache的默认超时也为300(5分钟)。因此,当您增加一个超时时,您可能会遇到另一个超时,并且也必须增加它。

另一个解决这个问题的方法是在命令行模式下运行PHP,从shell脚本或批处理文件或其他东西。这样可以避免大多数超时(至少在Apache和PHP中)。

您实际上希望在php.ini文件中查找mssql.timeout值。或者如果它不在那里设置它。默认值是60(秒),也就是你点击的时间。