Форум: "Базы";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
ВнизLIKE и хранимая процедура Найти похожие ветки
← →
Dp (2003-11-28 12:56) [0]Добрый день. Как правильно составить 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+"%"+""")";
и все работает правильно.
← →
clickmaker (2003-11-28 13:06) [1]"%" + @ClientID + "%"
← →
bon (2003-11-28 13:08) [2]StrSql:="CREATE PROCEDURE IdRequery @ClientID char(20) "+
"AS "+
"SELECT * FROM Klients WHERE (Cli_id LIKE "%"+@ClientID+"%")";
← →
Dp (2003-11-28 13:12) [3]2 clickmakeк & bon
На предложенный Вами вариант ругается: [Error] Unit1.pas(66): Illegal character in input file: "%" ($25)
← →
Dp (2003-11-28 13:20) [4]Съедает вот что:
StrSql:="CREATE PROCEDURE IdRequery @ClientID char(20) "+
"AS "+
"SELECT * FROM Klients WHERE (Cli_id LIKE """+"%"+"""+@ClientID+"""+"%"+""")";
← →
Dp (2003-11-28 13:35) [5]Только теперь, при вызове из клиентской части ничего не находит, хотя записи есть:
StrSql:="EXECUTE IdRequery 123"; или
StrSql:="EXECUTE IdRequery "123""; или еще как - ему по барабану!
Наставьте начинающего на путь истинный!
← →
b0bi (2003-11-28 14:04) [6]StrSql:="CREATE PROCEDURE IdRequery @ClientID char(20) "+
"AS "+
"SELECT * FROM Klients WHERE (Cli_id LIKE """+"%"+@ClientID+"%"+""")";
← →
Dp (2003-11-28 14:12) [7]Короче, что-то искаться начинает при таком раскладе:
StrSql:="CREATE PROCEDURE IdRequery @ClientID char(20) "+
"AS "+
"SELECT * FROM Klients WHERE (Cli_id LIKE @ClientID)";
Вызов: StrSql:="EXECUTE IdRequery """+"%"+Edit1.Text+"%"+"""";
Но число записей по сравнению с вариантом:
StrSql:="SELECT * FROM Klients WHERE (Cli_id LIKE """+"%"+Edit1.Text+"%"+""")";
РАЗЛИЧАЕТСЯ!
← →
Nikolay M. (2003-11-28 14:35) [8]А если не секрет, зачем для простого селекта городить ХП?
← →
Dp (2003-11-28 14:44) [9]SELECT будет не простой :).
← →
Val (2003-11-28 15:07) [10]>Dp (28.11.03 14:44) [9]
даже если очень непростой, зачем создаете процедуру из клиентского приложения??
← →
Dp (2003-11-28 15:34) [11]Так получилось.... Разумеется, можно воспользоваться средствами Enterprise Manager-а. Но вопрос не в этом, а в моем предпредпоследнем посте. А процедуру можно создать хоть где - резалт один!
← →
Shirson (2003-11-28 15:48) [12]
StrSql:="CREATE PROCEDURE IdRequery @ClientID char(20) "+
"AS "+
"SELECT * FROM Klients WHERE (Cli_id LIKE "+quotedstr("%")+"+@ClientID+"+quotedstr("%")+")";
Вызов:
StrSql:="EXECUTE IdRequery "+quotedstr("%"+Edit1.Text+"%");
Теперь вопрос на засыпку. На кой нужно ставить wildchars И в сторедной процедуре И в клиентской части?
Вызов достаточно осуществлять так:
StrSql:="EXECUTE IdRequery "+quotedstr(Edit1.Text);
проценты сама сторедная процедура поставит.
И вообще, переходи на использованиеParameters
, чтобы огород из апострофов не городить и не путаться.
← →
Dp (2003-11-28 16:28) [13]Shirson, большое спасибо!
Но вопрос о неодинаковом числе возвращаемых записей НЕ снялся!
Кроме того, процедура возвращает не нулевое число записей только в варианте ее вызова:
StrSql:="EXECUTE IdRequery """+"%"+Edit1.Text+"%"+"""";
При этом, ставить % в теле процедуры или нет неважно!
← →
Dp (2003-11-29 00:55) [14]Господа, так может кто нибудь объяснить причину проблем или нет? Перерыл кучу литературы, но ответа не нашел! Почему простой запрос работает как часики, а хранимая процедура выпендривается? Понятно, что я не учитываю неких тонкостей, но не нашел - каких.... Все проверял на специальной тестовой таблице. Факт - процедура ВСЕГДА (при моем подходе) возвращает меньшее число записей, чем простой запрос. Подобными вещами приходится заниматься по прихоти начальства - хотят "совсем тонкого клиента" %( !
← →
Nikolay M. (2003-11-29 12:45) [15]Пример записей, которые (не)возвращаются, плз?
> хотят "совсем тонкого клиента"
Делай простую трехзвенку. Создание ХП из клиента (или это Application layer?) смахивает на что угодно, но только не " совсем тонкого клиента"!
А вообще, менял бы ты такое начальство... На пиво, к примеру :?)
← →
Dp (2003-11-29 13:49) [16]2 Nikolay M.
Точный пример приведу в понедельник - сейчас дома "На пиво, к примеру ":). Навскидку...
0123
1234
4123
123
1230
`1236
Так вот, ХП не возвращает часть этих записей, а простой запрс - все.
Создавать процедуры из клиента НЕ буду. Ну получилось так один разок.
← →
Dp (2003-11-29 13:50) [17]Добавление - ищем строки, где содержится, к примеру 123.
← →
Nikolay M. (2003-11-29 13:56) [18]
> ХП не возвращает часть этих записей
Какие именно?
Когда увидишь разницу, почти наверняка поймешь в чем дело.
А вообще, я не в курсе, можно ли так легко сделать LIKE "%ЧТОТО%" где ЧТОТО - передается с клиента.
Имхо, попахивает курсором или динамическим запросом :(
← →
Dp (2003-11-29 14:33) [19]Сейчас попробовал дома (благо 3я ось W2K Server для работы) - вообще ничего не возвращает ни при каких условиях :((. Что через ADO, что через BDE. А простой запрос - по прежнему работает.
← →
Nikolay M. (2003-11-29 14:42) [20]Говорю же - имхо, не получится с кандачка так сделать.
Смотри в сторону динамо запросов и курсоров.
← →
Shirson (2003-11-29 19:56) [21]Делается это хоть с кандачка, хоть с потолка. :)
DP, а ты не пробовал тип аргумента сторедной процедуры задавать неchar(20)
, аvarchar(20)
?
← →
Nikolay M. (2003-11-29 21:05) [22]
> Shirson © (29.11.03 19:56) [21]
> Делается это хоть с кандачка, хоть с потолка. :)
Дык покажи как. А пальцами греметь каждый может.
← →
Shirson (2003-11-30 09:41) [23]Я уже показал :)
← →
Nikolay M. (2003-11-30 11:11) [24]
> Shirson © (30.11.03 09:41) [23]
А где тогда автор с благодарностями? :?)
← →
Shirson (2003-11-30 11:34) [25]Ждём-с :)
Ничего не запрещает делать такие вещи, вопрос, что их нужно делать правильно.
У меня на лету и не такой сложности запросы собираются - и ничего, работают.
← →
Dp (2003-12-01 08:41) [26]Автор появился с огромными благодарностями! Shirson, все заработало как надо. Но вот какая ему разница в данном случае char или varchar? Хотя, работает - это САМОЕ главное.
← →
Nikolay M. (2003-12-01 09:25) [27]
> Shirson © (29.11.03 19:56) [21]
Присоеднияюсь к [26]. Мой респект и хотелось бы услышать разъяснения :)
← →
Shirson (2003-12-01 10:48) [28]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 11:39) [29]Тьфу, ну да, конечно... Насчет char, конечно, просмотрел, начал усложнять....
← →
Sandman25 (2003-12-01 12:04) [30]Я думаю, можно было решить и попроще.
LIKE % + Trim(@ClientId) + %.
← →
Shirson (2003-12-01 13:28) [31]Да, это бы помогло (только в SQL команды
trim
нету. Нуженrtrim
).
Дело было в осознании "а почему оно так".
Кстати работоспособность sp с командойrtrim
подтверждает вариант, что недостающие до 20 байты используются в pattern.
← →
Sandman25 (2003-12-01 13:40) [32][31] Shirson © (01.12.03 13:28)
Это особенно заметно в dbExpress, где запрос вида select char10 from table возвращает "1 ", хотя данные вставлялись "правильные". Приходится писать trim в каждом select. Но с другой стороны, сетевой траффик уменьшается, а это уже хорошо.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.23;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.009 c