Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

LIKE и хранимая процедура [D7, MSSQL]


Страницы:   1 2

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+"%"+"""";

При этом, ставить % в теле процедуры или нет неважно!


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо