![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
LIKE и хранимая процедура [D7, MSSQL]
Dp © (2003-11-28 12:56:00)
Добрый день. Как правильно составить SQL-запрос на создание хранимой процедуры типа:
StrSql:="CREATE PROCEDURE IdRequery @ClientID char(20) "+
"AS "+
"SELECT * FROM Klients WHERE (Cli_id LIKE %@ClientID%)";
Каков правильный синтаксис? Как необходимо: "%@ClientID%" или по другому? Если можно, с расстановкой апострофов!!! Уже запутался. При запросе с клиентской части пишу:
StrSql:="SELECT * FROM Klients WHERE (Cli_id LIKE """+"%"+Edit1.Text+"%"+""")";
и все работает правильно.
Sandman25 (2003-12-01 13:40:00) [1]
[31] Shirson © (01.12.03 13:28)
Это особенно заметно в dbExpress, где запрос вида select char10 from table возвращает "1 ", хотя данные вставлялись "правильные". Приходится писать trim в каждом select. Но с другой стороны, сетевой траффик уменьшается, а это уже хорошо.
Shirson (2003-12-01 13:28:00) [2]
Да, это бы помогло (только в SQL команды
trimнету. Нуженrtrim).
Дело было в осознании "а почему оно так".
Кстати работоспособность sp с командойrtrimподтверждает вариант, что недостающие до 20 байты используются в pattern.
Sandman25 (2003-12-01 12:04:00) [3]
Я думаю, можно было решить и попроще.
LIKE % + Trim(@ClientId) + %.
Nikolay M. (2003-12-01 11:39:00) [4]
Тьфу, ну да, конечно... Насчет char, конечно, просмотрел, начал усложнять....
Shirson (2003-12-01 10:48:00) [5]
it"s kind of magic...
(шутка :))
Видимо всё дело в длине. Если char задан как (20), то независимо от того, что в него запихнули, он будет длиною 20. Если varchar задан как (20), то его длина будет отнюдь не 20, а столько, сколько засунули (но не больше 20).
Передавая sp нечто, из 20 байт, из которых нами определены только несколько первых, сервер делает Ы-Ы-Ы-Ы-Ы и использует все 20 байт как pattern.
Можно точно выяснить, в этом ли дело или нет, если в query analiser врубить Execution Plan и прогнать его органолептически, на предмет того, ЧТО именно улетело как аргумент sp.
Nikolay M. (2003-12-01 09:25:00) [6]
> Shirson © (29.11.03 19:56) [21]
Присоеднияюсь к [26]. Мой респект и хотелось бы услышать разъяснения :)
Dp (2003-12-01 08:41:00) [7]
Автор появился с огромными благодарностями! Shirson, все заработало как надо. Но вот какая ему разница в данном случае char или varchar? Хотя, работает - это САМОЕ главное.
Shirson (2003-11-30 11:34:00) [8]
Ждём-с :)
Ничего не запрещает делать такие вещи, вопрос, что их нужно делать правильно.
У меня на лету и не такой сложности запросы собираются - и ничего, работают.
Nikolay M. (2003-11-30 11:11:00) [9]
> Shirson © (30.11.03 09:41) [23]
А где тогда автор с благодарностями? :?)
Shirson (2003-11-30 09:41:00) [10]
Я уже показал :)
Nikolay M. (2003-11-29 21:05:00) [11]
> Shirson © (29.11.03 19:56) [21]
> Делается это хоть с кандачка, хоть с потолка. :)
Дык покажи как. А пальцами греметь каждый может.
Shirson (2003-11-29 19:56:00) [12]
Делается это хоть с кандачка, хоть с потолка. :)
DP, а ты не пробовал тип аргумента сторедной процедуры задавать неchar(20), аvarchar(20)?
Nikolay M. (2003-11-29 14:42:00) [13]
Говорю же - имхо, не получится с кандачка так сделать.
Смотри в сторону динамо запросов и курсоров.
Dp (2003-11-29 14:33:00) [14]
Сейчас попробовал дома (благо 3я ось W2K Server для работы) - вообще ничего не возвращает ни при каких условиях :((. Что через ADO, что через BDE. А простой запрос - по прежнему работает.
Nikolay M. (2003-11-29 13:56:00) [15]
> ХП не возвращает часть этих записей
Какие именно?
Когда увидишь разницу, почти наверняка поймешь в чем дело.
А вообще, я не в курсе, можно ли так легко сделать LIKE "%ЧТОТО%" где ЧТОТО - передается с клиента.
Имхо, попахивает курсором или динамическим запросом :(
Dp (2003-11-29 13:50:00) [16]
Добавление - ищем строки, где содержится, к примеру 123.
Dp (2003-11-29 13:49:00) [17]
2 Nikolay M.
Точный пример приведу в понедельник - сейчас дома "На пиво, к примеру ":). Навскидку...
0123
1234
4123
123
1230
`1236
Так вот, ХП не возвращает часть этих записей, а простой запрс - все.
Создавать процедуры из клиента НЕ буду. Ну получилось так один разок.
Nikolay M. (2003-11-29 12:45:00) [18]
Пример записей, которые (не)возвращаются, плз?
> хотят "совсем тонкого клиента"
Делай простую трехзвенку. Создание ХП из клиента (или это Application layer?) смахивает на что угодно, но только не " совсемтонкого клиента"!
А вообще, менял бы ты такое начальство... На пиво, к примеру :?)
Dp (2003-11-29 00:55:00) [19]
Господа, так может кто нибудь объяснить причину проблем или нет? Перерыл кучу литературы, но ответа не нашел! Почему простой запрос работает как часики, а хранимая процедура выпендривается? Понятно, что я не учитываю неких тонкостей, но не нашел - каких.... Все проверял на специальной тестовой таблице. Факт - процедура ВСЕГДА (при моем подходе) возвращает меньшее число записей, чем простой запрос. Подобными вещами приходится заниматься по прихоти начальства - хотят "совсем тонкого клиента" %( !
Dp (2003-11-28 16:28:00) [20]
Shirson, большое спасибо!
Но вопрос о неодинаковом числе возвращаемых записей НЕ снялся!
Кроме того, процедура возвращает не нулевое число записей только в варианте ее вызова:
StrSql:="EXECUTE IdRequery """+"%"+Edit1.Text+"%"+"""";
При этом, ставить % в теле процедуры или нет неважно!