Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
1-75170
Дельфи
2003-12-09 16:07
2003.12.23
Как прокрутить TRichEdit вниз?


7-75436
Genek84
2003-10-14 13:48
2003.12.23
Программа съедает память!


1-75228
VitGun
2003-12-09 19:11
2003.12.23
Построение сети Петри


3-75117
Inkotex
2003-11-28 16:51
2003.12.23
Очистка базыданых


14-75385
SergP
2003-11-28 08:49
2003.12.23
Интернет - свалка всякой заразы....





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский