Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.12.23;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.024 c
14-75365
race1
2003-11-29 05:49
2003.12.23
rewriter


14-75351
Magic lantern
2003-11-26 19:27
2003.12.23
Мануал по UdpSocket


14-75319
barbi
2003-12-01 15:56
2003.12.23
Ремонт квартиры


9-75067
JohnJ
2003-05-31 13:16
2003.12.23
Большая карта...


14-75384
Dimka Maslov
2003-12-01 14:49
2003.12.23
Немного о политике