【问题标题】:How to return value from stored procedure using PDO on MSSQL database如何在 MSSQL 数据库上使用 PDO 从存储过程中返回值
【发布时间】:2018-08-17 10:19:29
【问题描述】:

我有一个存储过程,它在调用时会更新几个表并最终返回一个整数值。

当我使用 SQL Pro 工具调用此存储过程时,我得到了预期的结果。该工具自动生成的SQL是这样的;

DECLARE @return_value int

EXEC @return_value =
    dbo.GetNextReference
        @c_tableName = 'prp',
        @c_offYear = 'rcs14'

SELECT
    'Return Value' = @return_value

但是,当我尝试使用 PHP PDO 驱动程序执行此操作时,我似乎无法获得相同的结果或任何结果。

这是我目前的代码;

  $conn = $this->getPDO();
  $sql = "CALL GetNextReference (? , ?)";
  $stmt = $conn->prepare($sql);
  $tbl = 'prp';
  $year = "rcs14";
  $stmt->execute([$tbl, $year]);
  $results = $stmt->fetchAll();

语句执行没有任何错误,但结果返回为空数组。

我错过了什么?

对不起,我不能发布实际的存储过程,因为我不允许。

【问题讨论】:

  • 不要在 SP 上使用返回值,使用 OUTPUT 参数。
  • 如果您还没有这样做,请将SET NOCOUNT ON 添加到存储的过程中,以便不会返回受影响的行消息。这可能会干扰未正确编码以处理它们的客户端的结果集处理。
  • 嗨@Larnu,你能给我举个例子吗?
  • 对不起,我忘了说,修改存储过程目前不是一种选择,因为我们有很多现有的系统依赖它。
  • 如果可以的话,我真的建议您对更改它进行反馈。

标签: php sql-server pdo


【解决方案1】:

如果我正确理解了您的问题,并且您想检查存储过程的执行结果,您可以试试这个:

<?php
# Connection
$server = 'server\instance,port';
$database = 'database';
$uid = 'user';
$pwd = 'password';

# Statement
try {
    $conn = new PDO("sqlsrv:server=$server;Database=$database", $uid, $pwd);
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server" );
}

try {
    $sql  = "{? = call GetNextReference (? , ?)}";
    # This should work also.
    #$sql = "exec ? = GetNextReference (? , ?)";
    $spresult = 0;
    $tbl  = 'prp';
    $year = "rcs14";
    $stmt = $conn->prepare($sql);
    $stmt->bindParam(1, $spresult, PDO::PARAM_INT|PDO::PARAM_INPUT_OUTPUT, PDO::SQLSRV_PARAM_OUT_DEFAULT_SIZE);
    $stmt->bindParam(2, $tbl);
    $stmt->bindParam(3, $year);
    $stmt->execute();
    # Next line for single resultset 
    #$results = $stmt->fetchAll();
    # Multiple resultsets
    do {
        $results = $stmt->fetchAll();
        print_r($results, true);
    } while ($stmt->nextRowset());  
} catch( PDOException $e ) {
    die( "Error connecting to SQL Server" );
}

$stmt = null;
$conn = null;

echo 'Stored procedure return value : '.$spresult."</br>";
?>

【讨论】:

    【解决方案2】:

    Op 要求提供OUTPUT 参数的示例。它没有具体回答他们的问题,但是,评论太长了:

    USE Sandbox;
    GO
    --Sample Table
    CREATE TABLE dbo.TestTable (ID int IDENTITY(1,1),
                                SomeString varchar(20));
    
    GO
    --Sample proc
    CREATE PROC dbo.TestSP @SomeString varchar(20), @ID int OUTPUT AS
    
        --You cannot OUTPUT from an INSERT into a scalar variable, so we need a table variable
        DECLARE @IDt table(ID int);
    
        INSERT INTO dbo.TestTable (SomeString)
        OUTPUT inserted.ID
        INTO @IDt
        SELECT @SomeString;
    
        --Now set the scalar OUTPUT parameter to the value in the table variable    
        SET @ID = (SELECT ID FROM @IDt); --this works, as the SP is designed for only one row insertion
    
    GO
    
    DECLARE @SomeString varchar(20) = 'abc', @ID int;
    
    EXEC dbo.TestSP @SomeString = @SomeString,
                    @ID = @ID OUTPUT; --ID now has the value of the IDENTITY column
    
    --We can check here:
    SELECT @ID AS OutputID;
    SELECT *
    FROM dbo.TestTable;
    GO
    --Clean up
    DROP PROC dbo.TestSP;
    DROP TABLE  dbo.TestTable;
    GO
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 2021-10-02
      • 2021-10-08
      • 2023-04-10
      • 2019-06-20
      • 2014-08-08
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多