【问题标题】:How to capture T-SQL output generated by print statement with PHP ODBC client?如何使用 PHP ODBC 客户端捕获打印语句生成的 T-SQL 输出?
【发布时间】:2013-11-08 09:53:21
【问题描述】:

我有一个存储过程,它使用事务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

【问题讨论】:

  • 你能出示你的代码吗?
  • @shivan 他们在这里......

标签: php sql-server tsql odbc


【解决方案1】:

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

请注意,“获取最后一条消息”与“获取错误消息”不同。事实上,这 2 个 MSSQL PHP 驱动程序的工作方式不同。你不能指望他们返回相似的结果。

此外,在 PHP 5.3 中删除了 mssql_* 函数。请改用 sqlsrv_* 函数(需要从 Microsoft 安装额外的软件)。阅读further

根据documentation

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

【讨论】:

  • 你说得对,但这并不能解决问题。我不能使用 sql_srv,因为它与 sql server 2000 不兼容。
  • 如果既不打印也不返回工作,我还能如何从存储过程中返回值(整数)?
  • 不正确。 sqlsrv 与 SQL Server 2000 兼容。请参阅:sqlsrvphp.codeplex.com/discussions/35511
  • ODBC 驱动程序不支持存储过程。来自documentation如果您需要使用 INOUT 或 OUT 参数调用存储过程,建议的解决方法是为您的数据库使用本机扩展(例如 MS SQL Server 的 mssql)跨度>
  • 是的,sqlsrv 与 sql server 2000 兼容,但 sqlsrv 版本 3.0,这是唯一与 php 5.4 兼容的版本,不再支持 sql server 2000。
【解决方案2】:

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

替换旧的 5.2 PHP 代码:

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

在 PHP 5.4 代码中使用 php_odbc:

$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'];

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

【讨论】:

  • 这个解决方案实际上是一个聪明的解决方法。同意您在答案中指出的内容,如果存储过程返回结果表,这将不起作用。我能想到的另一个愚蠢的解决方法是输出到文件并用 PHP 读回。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-08
相关资源
最近更新 更多