Я пытаюсь вызвать хранимую процедуру на MS SQL Server, но я получаю пустой результат. Хранимая процедура принимает идентификатор пользователя в качестве входного параметра и выводит имя, адрес, город, штат и почтовый индекс пользователя.
Вот запрос на выполнение хранимой процедуры в SQL Server Management Studio:
USE [MYDB]
GO
DECLARE @return_value int,
@Name char(60),
@Address char(60),
@City char(30),
@State char(3),
@Zip char(10)
EXEC @return_value = [dbo].[spAddressByUserID]
@UserID = N'AB1234',
@Name = @Name OUTPUT,
@Address = @Addr1 OUTPUT,
@City = @City OUTPUT,
@State = @State OUTPUT,
@Zip = @Zip OUTPUT
SELECT @Name as N'@Name',
@Address as N'@Address',
@City as N'@City',
@State as N'@State',
@Zip as N'@Zip'
SELECT 'Return Value' = @return_value
GO
До сих пор я пробовал следующий код:
<?php
$conn = sqlsrv_connect( $host, $connectionInfo);
$user_id = 'AB1234';
$myparams['UserID'] = $user_id;
$procedure_params = array(
array(&$myparams['UserID'], SQLSRV_PARAM_IN),
array(&$myparams['Name'], SQLSRV_PARAM_IN),
array(&$myparams['Address'], SQLSRV_PARAM_IN),
array(&$myparams['City'], SQLSRV_PARAM_IN),
array(&$myparams['State'], SQLSRV_PARAM_IN),
array(&$myparams['Zip'], SQLSRV_PARAM_IN)
);
$sql = "EXEC spAddressByUserID @UserID = ?, @Name = '', @Address = '', @City = '', @State = '', @Zip = ''";
$stmt = sqlsrv_prepare($conn, $sql, $procedure_params);
if( !$stmt ) {
die( print_r( sqlsrv_errors(), true));
}
if(sqlsrv_execute($stmt)){
while($res = sqlsrv_next_result($stmt)){
print_r($res); // Gives Empty Output
}
}
else{
die( print_r( sqlsrv_errors(), true));
}
Я думаю, что весь мой синтаксис правильный. Но я получаю пустой вывод. Не уверен, что я делаю не так.
РЕДАКТИРОВАТЬ:
Я изменил параметры массива запроса следующим образом, но безуспешно:
$procedure_params = array(
array(&$myparams['UserID'], SQLSRV_PARAM_IN, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['Name'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['Address'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['City'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['State'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING'),
array(&$myparams['Zip'], SQLSRV_PARAM_OUT, 'SQLSRV_PHPTYPE_STRING')
);
Можете ли вы успешно запустить процесс в SQL Management Studio? Выглядит так, как будто вам не хватает некоторых заполнителей в вашем SQL в PHP. Только один ?
в запросе. Возможно, это лучше?
$sql = "EXEC spAddressByUserID @UserID = ?, @Name = '?', @Address = '?', @City = '?', @State = '?', @Zip = '?'";
Я не очень знаком с хранимыми процессами такого рода, но с параметризованными заполнителями в подготовленных выражениях необходимо указывать все заполнители в правильном порядке. Из того, что вы опубликовали, мне кажется, что вы не добавляете заполнители во всех местах, где это необходимо, и, возможно, именно поэтому вы не получаете результат обратно?
Других решений пока нет …