помогите с хранимыми процедурами mssql Yii2
помогите с хранимыми процедурами mssql Yii2
Здравствуйте. Есть хранимая процедура семантического поиска FindSmet по базе. На вход подается параметр @name, где указывается что я хочу найти( слово например принтеры). Как реализовать, чтобы при нажатии найти, вызывалась хранимая процедура и результаты отображались в grid. Хотя бы куда копать, по хранимым процедурам мало инфы.
что то типо такого:
$result = \Yii::$app->db->createCommand("Exec FindSmet(:name)")
->bindValue(':name' , $name )
->execute();
что то типо такого:
$result = \Yii::$app->db->createCommand("Exec FindSmet(:name)")
->bindValue(':name' , $name )
->execute();
Re: помогите с хранимыми процедурами mssql Yii2
А если так и запросить, только execute() заменить на queryAll().
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Re: помогите с хранимыми процедурами mssql Yii2
Ребят, так и не могу разобраться. как вызвать процедуру и после выполнения процедуры, sqldataprovider -ом передать все это в грид! помогите плыз, куда копать. Есть хранимая процедура семантического поиска FindSmet по базе. На вход подается параметр @name, где указывается что я хочу найти( слово например принтеры). Как реализовать, чтобы при нажатии найти, вызывалась хранимая процедура и результаты отображались в grid?
контроллер. Понятно что тут полный бред, по крайней мере вызов процедуры пошел))
public function actionIndex()
{
$command = Yii::$app->db->createCommand('{Call FindSmet_MTR_Semant(:name)}');
$command->bindParam(":name", $name);
$data = $command->queryAll();
$dataProvider = new SqlDataProvider([
'sql'=> $command ->sql,
'params' => $command->params,
'sort' => [
'attributes' => [
],
],
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
выдает SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Пустой или неопределенный полнотекстовый предикат.
The SQL being executed was: {Call FindSmet_MTR_Semant(NULL)} Как можно для проверки передать процедуре параметр например name =принтеры, чтобы процедура нашла все совпадения и передала это в грид.
контроллер. Понятно что тут полный бред, по крайней мере вызов процедуры пошел))
public function actionIndex()
{
$command = Yii::$app->db->createCommand('{Call FindSmet_MTR_Semant(:name)}');
$command->bindParam(":name", $name);
$data = $command->queryAll();
$dataProvider = new SqlDataProvider([
'sql'=> $command ->sql,
'params' => $command->params,
'sort' => [
'attributes' => [
],
],
]);
return $this->render('index', [
'dataProvider' => $dataProvider,
]);
}
выдает SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Пустой или неопределенный полнотекстовый предикат.
The SQL being executed was: {Call FindSmet_MTR_Semant(NULL)} Как можно для проверки передать процедуре параметр например name =принтеры, чтобы процедура нашла все совпадения и передала это в грид.
Re: помогите с хранимыми процедурами mssql Yii2
Код: Выделить всё
$command = Yii::$app->db->createCommand('EXEC FindSmet_MTR_Semant @name=:name');
$command->bindValue(':name', $name);
$result = $command->queryAll();
Re: помогите с хранимыми процедурами mssql Yii2
ошибку SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server]Syntax error, permission violation, or other nonspecific error
Failed to prepare SQL: {EXEC FindSmet_MTR_Semant @name=:name}
Failed to prepare SQL: {EXEC FindSmet_MTR_Semant @name=:name}
Re: помогите с хранимыми процедурами mssql Yii2
В моём коде были фигурные скобки? Нет. Для чего вы запрос в них помещаете?
Re: помогите с хранимыми процедурами mssql Yii2
нет, прошу прощения, тупанул. SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Пустой или неопределенный полнотекстовый предикат.
The SQL being executed was: EXEC FindSmet_MTR_Semant @name=NULL
так я понимаю, теперь параметр имеет значение null, так как ничего процедуре не передали?
для наглядности процедура поиска :
ALTER PROCEDURE [dbo].[FindSmet_MTR_outSemant]
@name nvarchar(1000)
as
set @name=replace(@name, '_', '[_]')
set @name=replace(@name, '%', '[%]')
set @name=replace(@name, '[', '[[]')
set @name=replace(@name, ']', '[]]')
begin
SELECT dbo.MTR_Svod..........
FROM dbo.SmetName ........
CONTAINSTABLE(dbo.SmetName, SmetName, @name)
AS KEY_TBL
ON dbo.SmetName.NumMTR = KEY_TBL .[KEY]
ORDER BY KEY_TBL.RANK DESC
END
The SQL being executed was: EXEC FindSmet_MTR_Semant @name=NULL
так я понимаю, теперь параметр имеет значение null, так как ничего процедуре не передали?
для наглядности процедура поиска :
ALTER PROCEDURE [dbo].[FindSmet_MTR_outSemant]
@name nvarchar(1000)
as
set @name=replace(@name, '_', '[_]')
set @name=replace(@name, '%', '[%]')
set @name=replace(@name, '[', '[[]')
set @name=replace(@name, ']', '[]]')
begin
SELECT dbo.MTR_Svod..........
FROM dbo.SmetName ........
CONTAINSTABLE(dbo.SmetName, SmetName, @name)
AS KEY_TBL
ON dbo.SmetName.NumMTR = KEY_TBL .[KEY]
ORDER BY KEY_TBL.RANK DESC
END
Последний раз редактировалось kidkb 2019.02.07, 09:52, всего редактировалось 1 раз.
Re: помогите с хранимыми процедурами mssql Yii2
Ну так вы передайте что-нибудь в $name и/или обработку пустого параметра на стороне хранимой процедуры сделайте.
Re: помогите с хранимыми процедурами mssql Yii2
а как в коде передать в $name , забрать ответ и dataprovider -ом вывести ? хоть примерно
Re: помогите с хранимыми процедурами mssql Yii2
Создаёте отдельную поисковую модель, где на основе входных параметров (в данном случае это будет значение для $name) подготавливаете SqlDataProvider с нужным биндом для ':name'. Из контроллера передаёте модель и данный провайдер во view, где скармливаете GridView (всё как обычно). В модели у провайдера отключаете пагинацию и сортировку, т.к. ничего из этого работать не сможет.
Код: Выделить всё
...
$dataProvider = new \yii\data\SqlDataProvider([
'sql' => 'EXEC FindSmet_MTR_Semant @name=:name',
'params' => [':name' => $model->name],
'pagination' => false,
'sort' => false,
]);
...
Re: помогите с хранимыми процедурами mssql Yii2
пытаюсь передать значение нпример:
$name='hp';
или так ничего не выйдет?
Database Exception – yii\db\Exception
SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Неправильный синтаксис около ключевого слова "EXEC".
The SQL being executed was: SELECT COUNT(*) FROM (EXEC FindSmet_MTR_Semant @name='hp') [sub]
$name='hp';
или так ничего не выйдет?
Database Exception – yii\db\Exception
SQLSTATE[42000]: [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Неправильный синтаксис около ключевого слова "EXEC".
The SQL being executed was: SELECT COUNT(*) FROM (EXEC FindSmet_MTR_Semant @name='hp') [sub]
Re: помогите с хранимыми процедурами mssql Yii2
О, спасибо большое, буду пробовать
Re: помогите с хранимыми процедурами mssql Yii2
Разобрался, все заработало, спасибо! есть еще вопрос, а как в таком случае починить пагинацию?
Re: помогите с хранимыми процедурами mssql Yii2
1) Хранимая процедура должна возвращать общее количество записей для пагинатора.
2) Хранимая процедура должна уметь на вход принимать параметры: текущую позицию и смещение и на основе этих данных возвращать нужные строки (OFFSET)
3) После реализации п.1 и п.2 конфигурируете свой пагинатор (смотри yii\data\Pagination) и скармливаете провайдеру.
2) Хранимая процедура должна уметь на вход принимать параметры: текущую позицию и смещение и на основе этих данных возвращать нужные строки (OFFSET)
3) После реализации п.1 и п.2 конфигурируете свой пагинатор (смотри yii\data\Pagination) и скармливаете провайдеру.
Re: помогите с хранимыми процедурами mssql Yii2
да, мое предположение верно. Спасибо большое Alexum за помощь!