Laravel 型号 SQL 服务器:从存储过程获取输出参数

Laravel Model SQL Server: Get Output Parameters from Stored Procedure

我想从 Laravel 模型中的 SQL 服务器存储过程中获取输出参数,该存储过程在 SQL 服务器管理工​​具中运行良好,并且也在正常 php 文件中,但它在 LARAVEL 模型中不起作用。

这就是我在 Laravel 模型中执行存储过程的方式:

    $id              =   "123454";
    $email           =   "ABC@ABC.com";
    $name            =   "FName, LName";
    $returnval        =   1; //My OUTPUT PARAMETER from SP
    $action       =   'ACTION_MESSAGE;
    $dummy            =   0;
    $client          =   $request->input('client');
    $team_l          =   $request->input('team');
    $contact         =   $request->input('contact');
    $team            =   $request->input('team_l');

    $Query        =  DB::select
                            (" SET NOCOUNT ON; SET ANSI_NULLS ON; SET ANSI_WARNINGS ON; EXEC [MY_STORED_PROC]
                                        $client,
                                        $team,
                                        $contact,
                                        '$team_l',
                                        '$id',
                                        '$name',
                                        '$email',
                                        '$action',
                                        $dummy,
                                        $returnval
                            ");

在 Laravel 中,当我尝试 运行 存储过程时出现以下错误:

(3/3) QueryException
SQLSTATE[IMSSP]: The active result for the query contains no fields.

这就是我在 Normal PHP 中的使用方式:

    $id              =   "123454";
    $email           =   "ABC@ABC.com";
    $name            =   "FName, LName";
    $returnval       =   1; //My OUTPUT PARAMETER from SP
    $action          =   'ACTION_MESSAGE;
    $dummy           =   0;
    $client          =   $_POST('client');
    $team            =   $_POST('team');
    $contact         =   $_POST('contact');
    $team_l          =   $_POST('team_l');

    $Query        = "{ CALL  My_PROC_NAME(?,?,?,?,?,?,?,?,?,?) }";
    $PARAMS           = array(   array($client, SQLSRV_PARAM_IN),
                                array($team,        SQLSRV_PARAM_IN),
                                array($contact, SQLSRV_PARAM_IN),
                                array($team_l,      SQLSRV_PARAM_IN),
                                array($id,         SQLSRV_PARAM_IN),
                                array($name,       SQLSRV_PARAM_IN),
                                array($email,       SQLSRV_PARAM_IN),
                                array($action,      SQLSRV_PARAM_IN),
                                array($dummy,       SQLSRV_PARAM_IN),
                                array($returnval,   SQLSRV_PARAM_OUT)
                            );              

        $result     =   sqlsrv_query($connect, $Query,$PARAMS);

我的存储过程和一切似乎都很好。 我也尝试将以下内容保存在存储过程中,但没有成功:

SET NOCOUNT ON; 
SET ANSI_NULLS ON; 
SET ANSI_WARNINGS ON;

我是否必须 SELECT SP 中的 return 参数,以便我们可以循环并在 LARAVEL 模型中获取它。

非常感谢大家。

发布此答案,因为它对那些在 Web 开发过程中受到打击的人很有用。

经过大量研究并尝试了很多事情后,我知道答案就在我的问题本身的底部,我建议在我的存储过程末尾添加 SELECT 这将return 我的 Laravel 模型的价值。

这是一个示例存储过程:

CREATE PROCEDURE ReturnIdExample
    (
             @paramOne int
            ,@paramTwo nvarchar(255)
    )
    AS

    SET NOCOUNT ON; --IMPORTANT!

    BEGIN

    -- Grab the id that was just created
    DECLARE @ObjectID int;

    INSERT INTO [Table]
    (
             [ColumnNameA]
            ,[ColumnNameB]
    ) VALUES (
             @paramOne
            ,@paramTwo
    )

    SET @ObjectID = SCOPE_IDENTITY();

    -- Select the id to return it back to laravel
    SELECT@ObjectID AS ObjectID;

END

在 Laravel 中调用此存储过程 Model/Controller:

$submit = DB::select("EXEC ReturnIdExample ?,?", array( $paramOne ,$paramTwo ) );

访问 Laravel 模型中的 Return 变量:

return $submit[0]->ObjectId;

它对我来说非常有效,希望这会对你们有所帮助,你们不会像我一样在这上面浪费很多时间。祝你有美好的一天。

运行 Microsoft SQL 服务器存储过程(MS SQL 服务器)使用 PHP Laravel 框架。

如果您尝试使用 Laravel 模型 运行 SP,那么您可以使用以下两种方法。

$submit = DB::select(" EXEC ReturnIdExample ?,?", array( $paramOne ,$paramTwo ) ); 

$submit = DB::select(" EXEC ReturnIdExample $paramOne,$paramTwo ");

如果您要传递 Varchar 参数,请使用以下内容:

$submit = DB::select(" EXEC ReturnIdExample '$paramOne', '$paramTwo' ");

如果您只是传递 INT 或 BIGINT 参数,那么这应该可以工作,您可以从 SP:

获得 return
$submit = DB::select(" EXEC ReturnIdExample $paramOne,$paramTwo ");