首页 > 解决方案 > 如何使用 ODBC 在 PHP 中调用 MSSQL 存储过程并检索输出参数

问题描述

我正在尝试使用 ODBC 从 PHP 调用 MSSQL 存储过程,我想它是相当有效的。我的意思是,该过程被调用。我没有错误。但是我在检索输出参数时遇到了一些麻烦。

该过程不返回任何内容,但它有一个输出参数,即 a varchar,我需要获取此数据。

这是SQL中的代码:

CREATE PROCEDURE [dbo].[ProcName] 
    @peCodFact varchar(max) = NULL, 
    @peCodsAlmcs varchar(max) = NULL, 
    @peFechaConfDesde date = NULL, 
    @peFechaConfHasta date = NULL, 
    @peCodMed varchar(50) = NULL, 
    @psRegEjec varchar(max) = '<>' OUTPUT 
AS
BEGIN TRY
    /* data processing where @psRegEjec is set */
END TRY
BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_SEVERITY() AS ErrorSeverity, ERROR_STATE() AS ErrorState, ERROR_PROCEDURE() AS ErrorProcedure, ERROR_LINE() AS ErrorLine, ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;

所有输入参数都可以为空,我需要检索的参数是@psRegEjec.

这是PHP中的代码:

$idCon = odbc_connect($dns, $user, $passwd);
if (empty($idCon))
    throw new Exception(odbc_errormsg());

$query = 'DECLARE @psRegEjec varchar(max); ';
$query .= 'EXEC BDName.dbo.ProcName @psRegEjec = @psRegEjec OUTPUT; ';
$query .= 'SELECT @psRegEjec AS data; ';

$res = odbc_exec($idCon, $query);
$datosRes = @odbc_fetch_array($res);

我尝试使用 , 检索结果,并且都得到相同的odbc_fetch_object结果odbc_fetch_array。我得到的结果是......

\x0ø\x14\x7cen\x0)\x0\x0\x0\x11\x0\x0\x0Hø\x11\x7ado_nm_grupo_gestion\x0\xEÔ\x0\x18\r\x12\x7)\x0\x0\x0)\ x0\x0\x0~ø\x11\x7ccion_co_descripcion\x0\xF\x12\x7è\x11\x12\x7)\x0\x0\x0)\x0\x0\x0 ø\x11\x7ado_nm_funcionalidad\x0\xEÔ\x0P \x16\x12\x7)\x0\x0\x0)\x0\x0\x0 ù\x11\x7orporacion_descripcion\x0\x7 \x1B\x12\x7)\x0\x0\x0)\x0\x0\x0pø\ x11\x7raseña 前部\x0\x0^\x1F\x12\x7\x19\x0\x0\x0)\x0\x0\x0hú\x11\x7ripcion\x0\x0\x0\x0\x0y\x0\x0\x0\ x19\x0\x0\x0\xF\x1。

它继续,相当大......所以我真的不知道该怎么办。我在一些文章中看到,需要创建第二个过程,从第一个返回输出参数,因为 ODBC 驱动程序不支持过程输出参数......

真的是这样吗?还有其他方法吗?

标签: phpsql-server

解决方案


您可以尝试将输出参数的值转换为nvarchar(max). 如果您的存储过程执行 SELECT 语句,那么您将有多个结果集。接下来是工作示例:

存储过程:

CREATE PROCEDURE [dbo].[ProcNameODBC] 
    @peCodFact varchar(max) = NULL, 
    @peCodsAlmcs varchar(max) = NULL, 
    @peFechaConfDesde date = NULL, 
    @peFechaConfHasta date = NULL, 
    @peCodMed varchar(50) = NULL, 
    @psRegEjec varchar(max) = '<>' OUTPUT
AS
BEGIN TRY
    -- Your actual result set
    SELECT [Column] AS [Result] FROM [Table]
    -- Output parameter
    SET @psRegEjec = 'Value for the output parameter'
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber, 
        ERROR_SEVERITY() AS ErrorSeverity, 
        ERROR_STATE() AS ErrorState, 
        ERROR_PROCEDURE() AS ErrorProcedure, 
        ERROR_LINE() AS ErrorLine, 
        ERROR_MESSAGE() AS ErrorMessage;  
END CATCH;

PHP:

<html>
    <head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <meta charset="utf-8">
    <?php
    $sql_server   = "server\instance,port";
    $sql_user     = "uid";
    $sql_password = "pwd";
    $sql_database = "database";
    $sql_conn_string = 'Driver={SQL Server Native Client 11.0};Server='.$sql_server.';Database='.$sql_database.';';
    if ($sql_conn = odbc_connect($sql_conn_string, $sql_user, $sql_password)) {
        $sql = "EXEC ProcNameODBC";

        $sql = 'DECLARE @psRegEjec varchar(max); ';
        $sql .= 'EXEC ProcNameODBC @psRegEjec = @psRegEjec OUTPUT; ';
        $sql .= 'SELECT CONVERT(nvarchar(max), @psRegEjec) AS [Result]; ';
        #$sql .= 'SELECT @psRegEjec AS [Result]; ';

        # Result set from stored procedure
        $result = odbc_exec($sql_conn, $sql);
        while (odbc_fetch_row($result)) {
            $value = odbc_result($result, "Result");
            echo $value.'</br>';
        }

        # SELECT output parameter
        odbc_next_result($result);
        while (odbc_fetch_row($result)) {
            $value = odbc_result($result, "Result");
            echo $value.'</br>';
        }
    }
    ?>
    </head>
    <body></body>
</html>

笔记:

考虑使用SQL Server 的 PHP 驱动程序。该驱动程序完全支持存储过程的输入和输出参数。


推荐阅读