如何使用PHP ODBC客户端捕获print语句生成的T-SQL输出?

时间:2013-11-08 09:53:22

标签: php sql-server tsql odbc

我有一个存储过程,它使用transact print语句返回结果,以返回结果。

到目前为止,我使用php_mssql扩展名及其mssql_get_last_message()函数来获取返回的文本。

由于PHP已经放弃了对mssql扩展的支持,我决定回到php_odbc扩展名。

我遇到的问题是我无法使用odbc_errormsg()捕获信息。有没有办法使用PHP和ODBC检索打印消息?

我发现了一些有趣的问题,涉及printodbc的主题,但没有一个与PHP相关。

使用mssql的PHP代码(有效):

$query = "exec dbo.PdaBLCreer 12345";
$res = mssql_query($query);
$message = mssql_get_last_message();

带有odbc的PHP代码(不起作用,$ message始终为空):

$query = "exec dbo.PdaBLCreer 12345";
$res = odbc_exec($connection, $query);
$message = odbc_errormsg($connection);

T-SQL存储过程

CREATE PROCEDURE dbo.PdaBLCreer
    @iArgument int
AS
BEGIN
    ...
    PRINT @vNr
    RETURN @vNr
END

2 个答案:

答案 0 :(得分:1)

$message之前的空odbc_errmsg()是好的。这意味着没有错误。

请注意“获取最后一条消息”与“获取错误消息”不同。实际上,2 MSSQL PHP驱动程序的工作方式不同。你不能指望他们会得到类似的结果。

此外,作为旁注,在PHP 5.3中删除了mssql_*函数。请改用sqlsrv_*函数(需要Microsoft安装其他软件)。阅读further

根据documentation

  

返回包含最后一条ODBC错误消息的字符串,如果没有错误,则返回一个空字符串。

答案 1 :(得分:1)

我发现了这个解决方法。它适用于存储过程的return值,但不适用于print。由于我的存储过程打印并返回,因此可以从过程中获取结果而无需修改它:

替换旧的5.2 PHP代码:

$query = "exec dbo.PdaBLCreer 12345";
$res = mssql_query($query);
$message = mssql_get_last_message();

使用php_odbc这个PHP 5.4代码:

$query = "DECLARE @return_status int
    EXEC @return_status = dbo.PdaBLCreer 12345
    SELECT 'ReturnStatus' = @return_status";
$res = odbc_exec($connection, $query);
$line = odbc_fetch_array($res);
$message = $line['ReturnStatus'];

此解决方案有限。当您的查询返回表格结果和消息时,它将不起作用。