Я хочу получить выходной параметр из моей хранимой процедуры SQL Server в модели моего Laravel. Хранимая процедура отлично работает в инструменте управления SQL Server, а также в файле NORMAL php, но она не работает в LARAVEL MODEL.
Вот как я выполняю хранимую процедуру в модели Laravel:
$id = "123454";
$email = "[email protected]";
$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 = "[email protected]";
$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 MODEL.
Большое спасибо всем.
Публикация этого ответа будет полезна тем, кто будет поражен во время веб-разработки.
Проведя много исследований и опробовав множество вещей, я узнал, что ответ лежит в самом низу моего вопроса, где я предложил добавить 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;
Это сработало идеально для меня, надеюсь, это поможет вам, ребята, и вы не будете тратить много времени на это так же, как я. Хорошего дня.
Выполнение хранимой процедуры 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 ");