如何使用ODBC

时间:2019-01-28 08:45:23

标签: php sql-server

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

该过程不返回任何内容,但是有一个输出参数,它是一个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;

所有输入参数可以为null,我需要检索的参数为@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驱动程序不支持过程输出参数...

是真的吗?还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试将输出参数的值转换为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>

注意:

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