помогите с хранимыми процедурами mssql Yii2

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

Здравствуйте. Есть хранимая процедура семантического поиска FindSmet по базе. На вход подается параметр @name, где указывается что я хочу найти( слово например принтеры). Как реализовать, чтобы при нажатии найти, вызывалась хранимая процедура и результаты отображались в grid. Хотя бы куда копать, по хранимым процедурам мало инфы.
что то типо такого:
$result = \Yii::$app->db->createCommand("Exec FindSmet(:name)")
->bindValue(':name' , $name )
->execute();
someweb
Сообщения: 552
Зарегистрирован: 2017.03.09, 10:12

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение someweb »

А если так и запросить, только execute() заменить на queryAll().
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

спасибо
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

Ребят, так и не могу разобраться. как вызвать процедуру и после выполнения процедуры, 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 =принтеры, чтобы процедура нашла все совпадения и передала это в грид.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение Alexum »

Код: Выделить всё

$command = Yii::$app->db->createCommand('EXEC FindSmet_MTR_Semant @name=:name');
$command->bindValue(':name', $name);
$result = $command->queryAll();
Что возвращает?
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

ошибку 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}
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение Alexum »

kidkb писал(а): 2019.02.06, 20:06 ошибку 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}
В моём коде были фигурные скобки? Нет. Для чего вы запрос в них помещаете?
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

нет, прошу прощения, тупанул. 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
Последний раз редактировалось kidkb 2019.02.07, 09:52, всего редактировалось 1 раз.
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение Alexum »

Ну так вы передайте что-нибудь в $name и/или обработку пустого параметра на стороне хранимой процедуры сделайте.
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

а как в коде передать в $name , забрать ответ и dataprovider -ом вывести ? хоть примерно
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение Alexum »

Создаёте отдельную поисковую модель, где на основе входных параметров (в данном случае это будет значение для $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,
        ]);
...        
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

пытаюсь передать значение нпример:
$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]
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

О, спасибо большое, буду пробовать
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

Разобрался, все заработало, спасибо! есть еще вопрос, а как в таком случае починить пагинацию?
Аватара пользователя
Alexum
Сообщения: 683
Зарегистрирован: 2016.09.26, 10:00

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение Alexum »

1) Хранимая процедура должна возвращать общее количество записей для пагинатора.
2) Хранимая процедура должна уметь на вход принимать параметры: текущую позицию и смещение и на основе этих данных возвращать нужные строки (OFFSET)
3) После реализации п.1 и п.2 конфигурируете свой пагинатор (смотри yii\data\Pagination) и скармливаете провайдеру.
kidkb
Сообщения: 28
Зарегистрирован: 2019.01.29, 14:21

Re: помогите с хранимыми процедурами mssql Yii2

Сообщение kidkb »

да, мое предположение верно. Спасибо большое Alexum за помощь!
Ответить