SQL Server модели Laravel: получение выходных параметров из хранимой процедуры - PullRequest
0 голосов
/ 29 августа 2018

Я хочу получить выходной параметр из моей хранимой процедуры SQL Server в модели моего Laravel. Хранимая процедура отлично работает в инструменте управления SQL Server, а также в файле php NORMAL, но не работает в модели 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.

Вот как я работал в обычном 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;

Нужно ли ВЫБРАТЬ возвращаемый параметр в SP, чтобы мы могли выполнить цикл и получить его в МОДЕЛИ LARAVEL.

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Запуск хранимой процедуры Microsoft SQL Server (MS SQL Server) с использованием среды PHP Laravel.

Если вы пытаетесь запустить SP с использованием Laravel Model, вы можете использовать следующие два подхода.

$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:

$submit = DB::select(" EXEC ReturnIdExample $paramOne,$paramTwo ");
0 голосов
/ 31 августа 2018

Большое спасибо всем.

Публикация этого ответа, так как он будет полезен для тех, кто будет поражен во время их веб-разработки.

Проведя много исследований и опробовав множество вещей, я узнал, что ответ лежит в самом низу моего вопроса, где я предложил добавить SELECT в конце моей хранимой процедуры, которая вернет значение моему 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:

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

Доступ к возвращаемой переменной в модели Laravel:

return $submit[0]->ObjectId;

Это сработало идеально для меня, надеюсь, это поможет вам, ребята, и вы не будете тратить на это много времени, как я. Хорошего дня.

...