2011-10-17 75 views
2

我想调用MS SQL存储过程形式的php。从php执行MSSQL存储过程

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

但是,当试图从PHP调用它我得到这些错误。

警告:mssql_execute()[function.mssql-执行]:存储过程的执行用C失败:\ XAMPP \ htdocs中\的index.php上线145

致命错误:在超过60秒的最大执行时间在线146上的C:\ xampp \ htdocs \ index.php

在代码中,我在发帖行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); 
+0

在执行行后面回显mssql_get_last_message()以查找有关您的错误的更多信息。回传细节。 http://www.php.net/manual/en/function.mssql-get-last-message.php – Jrod 2011-10-17 13:08:35

+0

我添加了timout错误消息,并没有收到任何新的错误信息。 – 2011-10-17 13:15:08

回答

2

错误是说您的存储过程需要超过60秒才能运行。默认情况下,PHP在60秒内超时(这在php.ini中用mysql.connect_timeout设置为秒)

您应该尝试在SQL查询分析器中手动运行该过程,并使用相同的值,看看需要多长时间。例如,如果该文件是C:在服务器上的\ TEMP \ csvfile.csv,批次ID 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分钟)。因此,当你增加一次超时时间时,你可能会遇到另一个超时时间,并且必须增加这个时间。

解决此问题的另一种方法是在命令行模式下从shell脚本或批处理文件中运行PHP。这可以让你在大部分时间内(至少是Apache,PHP)。

0

您实际上想要查找php.ini文件中的mssql.timeout值。或者如果它不在那里设置它。 default is 60 (seconds)这就是你打的。