【问题标题】:PHP Get return value from MSSQL Stored ProcedurePHP 从 MSSQL 存储过程中获取返回值
【发布时间】:2023-04-10 20:05:01
【问题描述】:

我无法从我的 SQL Server (MSSQL 2012) SP 中获取 OUTPUT 参数以返回 PHP。我的存储过程是:

CREATE PROCEDURE spGetNextSeqID @ID AS INT OUTPUT
AS
BEGIN
    BEGIN TRANSACTION
    SELECT @ID = SEQUENCE_NO + 1 FROM tblCSRSequence WITH (TABLOCKX)
    UPDATE tblCSRSequence SET SEQUENCE_NO=@ID
    COMMIT TRANSACTION
END

而我的 PHP 代码是:-

<?php
include "DBConnect.php";
$conn = sqlsrv_connect( $serverName, $connection);
if( !$conn )
{
     echo "Connection could not be established to ".$serverName;
     die( print_r( sqlsrv_errors(), true));
}
$sql="{call dbo.spGetNextSeqID( ? )}";
$outSeq=0;
$params = array
    (
        array($outSeq, SQLSRV_PARAM_OUT)
    );

$stmt = sqlsrv_query( $conn, $sql, $params );

if( $stmt == false)
    die( print_r( sqlsrv_errors(), true) );

sqlsrv_free_stmt( $stmt);
sqlsrv_close( $conn );
echo $outseq;
?>

知道 SP 正在被调用并正在工作 - 我用跟踪检查了它,可以看到它正在生成以下内容:-

declare @p1 varchar(max)
set @p1='154'
exec dbo.spGetNextSeqID @p1 output
select @p1

每次我刷新浏览器页面时,它都会调用 SP 并将计数器加 1,但从不将值返回给调用 PHP 函数。我已经摆弄了大约 2 天了 - 我搜索了类似的帖子,但没有一个建议的修复(如 SET NOCOUNT ON 等)工作。

有人有什么想法吗?

【问题讨论】:

  • 既然您使用的是 sql 2012,您是否考虑过使用内置序列?与这种类型的滚动您自己的版本相比,它更不容易出错。 msdn.microsoft.com/en-us/library/ff878091.aspx
  • 嗨,肖恩,感谢您的回复。我还没有研究过内置序列——但我会的。虽然,如果它从 proc 返回一个 val,那么它仍然无法与我的代码一起使用(我猜 :-))
  • 是的,我可以在 sql 部分提供帮助,但我几乎不会拼写 php,更不用说在其中编写一行代码了。 :D

标签: php sql-server stored-procedures sqlsrv


【解决方案1】:

新:

我错过了您使用单个参数作为输入和输出。请尝试以下方法。

array($outSeq, SQLSRV_PARAM_INOUT)

然后使用

sqlsrv_next_result($stmt);
echo $outSeq;

参考: http://technet.microsoft.com/en-us/library/cc644932(v=sql.105).aspx

旧:

您必须使用适当的数据类型设置 $outSeq。尝试将值初始化为 $outSeq = 0.00,因为您的输出类型是 MONEY。

请参考以下文章:

http://technet.microsoft.com/en-us/library/cc626303(v=sql.105).aspx

【讨论】:

  • $outSeq 设置为 0 - int,你参考的文章中的输出是钱。我在 SP 上的输出类型设置为 INT (spGetNextSeqID @ID AS INT OUTPUT)。我参考了这篇文章,并且在发布到这里之前我已经阅读了它。没有任何帮助。我仍然一无所获。
  • 我不需要更改数组($outSeq,SQLSRV_PARAM_INOUT)。我将其保留为数组($outSeq,SQLSRV_PARAM_OUT)。正如您指出的那样,问题是我没有处理返回的结果-我(相当业余地)假设它只会获取返回的值-但是现在考虑一下,为什么会这样是完全有道理的没有工作。
  • 听起来不错。我很高兴您现在可以继续您的项目。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2013-01-22
  • 2021-10-08
  • 2014-05-03
  • 2021-10-02
  • 1970-01-01
相关资源
最近更新 更多