Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
denis_stell Member Откуда: Сообщений: 255 |
Добрый день, Есть база на ms sql, есть хранимая процедура, которая получает 2 входных параметра из внешнего приложения (2 даты), изменился немного функционал, добавился 3 параметр, это динамическая строка (формируется из клиентского приложения формат строки прост "and b.name_1 = 'Что-то' or ..........", строка меняется всегда, в зависимости от того что выбрал пользователь), в хранимой процедуре дописал входной параметр, например @p. Допустим у меня есть в хранимке обычный запрос: select a.*,b.name where a.id=b.id, нужно в условии применить параметр select a.*,b.name where a.id=b.id and @p, но сервак ругается "an expression of non-boolean type specified in a context where a condition is expected" Как исправить? |
29 ноя 13, 14:03 [15212149] Ответить | Цитировать Сообщить модератору |
pio777 Member Откуда: Сообщений: 127 |
denis_stell, Вам нужно в динамике формировать запрос. |
29 ноя 13, 14:05 [15212179] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
"and b.name_1 = 'Что-то' or ..........; DELETE a; DELETE b...", |
29 ноя 13, 14:08 [15212213] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
Вы имеете ввиду весь запрос на стороне клиента формировать? |
||
29 ноя 13, 17:09 [15214235] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
а зачем delete a, delete b, данная строка формируется на стороне клиента, в приложении в зависимости,от то что выбирет пользователь, ошибка на сервере, в момент компиляции хранимой |
||
29 ноя 13, 17:11 [15214251] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
если конечно поменять,таким образом: т.е. 1) Формируем строку в приложении в таком формате : 'что-то','что-то2'..... 2) На сервере,в хранимой, запрос: select a.*,b.name from t1 a,t2 b where a.id=b.id [b]and b.name in (@p)[/b] Как такой вариант? |
29 ноя 13, 17:16 [15214296] Ответить | Цитировать Сообщить модератору |
o-o
Guest |
это затем, чтобы Вы подумали на предмет SQL injection прежде чем собирать динамический запрос с участием переданного "хвоста" запроса |
||||
29 ноя 13, 17:25 [15214352] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
не взлетит |
||
29 ноя 13, 17:32 [15214388] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
Glory, а как можно сделать? |
29 ноя 13, 17:33 [15214397] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
Действительно, даже если вручную выполнить хранимую, результата нет |
||
29 ноя 13, 17:39 [15214435] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
Вопрос, тогда почему сервер не понимает? я для парамметра @p указываю 'что-то','что-то2' select не видит параметр |
29 ноя 13, 17:41 [15214447] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Он видит. Просто то, как он видит, не совпадает с вашими желаниями. |
||
29 ноя 13, 17:43 [15214468] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
Glory, у меня простые желания, чтобы вместо @p подставилось то что нужно |
29 ноя 13, 17:45 [15214479] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
В TSQL нет макроподстановок |
||
29 ноя 13, 17:46 [15214490] Ответить | Цитировать Сообщить модератору |
pio777 Member Откуда: Сообщений: 127 |
denis_stell,declare @sql varchar(8000) set @sql = 'select a.*,b.name where a.id=b.id ' + @p exec (@sql) |
29 ноя 13, 17:47 [15214493] Ответить | Цитировать Сообщить модератору |
leov Member Откуда: С-Петербург Сообщений: 616 |
дописать условие и отправить на сервер в виде запроса |
||
29 ноя 13, 17:48 [15214500] Ответить | Цитировать Сообщить модератору |
sdet Member Откуда: Сообщений: 463 |
Используйте таблицу как входной параметр |
||||
29 ноя 13, 18:13 [15214672] Ответить | Цитировать Сообщить модератору |
sdet Member Откуда: Сообщений: 463 |
denis_stell, select a.*,b.name from t1 a,t2 b where a.id=b.id and b.name in (select name from @p) |
29 ноя 13, 18:19 [15214711] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
sdet, SELECT из строки, да? :)) |
29 ноя 13, 18:30 [15214756] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
Что обработается сначала, а что потом? |
||
29 ноя 13, 18:32 [15214770] Ответить | Цитировать Сообщить модератору |
sdet Member Откуда: Сообщений: 463 |
из таблицы |
||
29 ноя 13, 18:37 [15214803] Ответить | Цитировать Сообщить модератору |
sdet Member Откуда: Сообщений: 463 |
iap, ему нужно b.name in (@p) |
29 ноя 13, 18:39 [15214811] Ответить | Цитировать Сообщить модератору |
denis_stell Member Откуда: Сообщений: 255 |
Спасибо всем за помощь, вопрос решен. |
2 дек 13, 16:43 [15226710] Ответить | Цитировать Сообщить модератору |
sdet Member Откуда: Сообщений: 463 |
Вы бы рассказали другим как решен вопрос? А то ведь вопрос можно решить отказавшись от проекта и уволившись ![]() |
||
2 дек 13, 17:40 [15227260] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |