Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 передача динамического параметра в хранимую процедуру  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
pio777
Member

Откуда:
Сообщений: 127
denis_stell,

Вам нужно в динамике формировать запрос.
29 ноя 13, 14:05    [15212179]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
"and b.name_1 = 'Что-то' or ..........; DELETE a; DELETE b...",
29 ноя 13, 14:08    [15212213]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
pio777
denis_stell,

Вам нужно в динамике формировать запрос.


Вы имеете ввиду весь запрос на стороне клиента формировать?
29 ноя 13, 17:09    [15214235]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
pkarklin
"and b.name_1 = 'Что-то' or ..........; DELETE a; DELETE b...",


а зачем delete a, delete b, данная строка формируется на стороне клиента, в приложении в зависимости,от то что выбирет пользователь, ошибка на сервере, в момент компиляции хранимой
29 ноя 13, 17:11    [15214251]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
o-o
Guest
denis_stell
pkarklin
"and b.name_1 = 'Что-то' or ..........; DELETE a; DELETE b...",


а зачем delete a, delete b

это затем, чтобы Вы подумали на предмет SQL injection
прежде чем собирать динамический запрос с участием переданного "хвоста" запроса
29 ноя 13, 17:25    [15214352]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104751
denis_stell
если конечно поменять,таким образом:
т.е.
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:32    [15214388]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Glory,

а как можно сделать?
29 ноя 13, 17:33    [15214397]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
denis_stell
 select a.*,b.name from t1 a,t2 b where a.id=b.id [b]and b.name in (@p)[/b]



Действительно, даже если вручную выполнить хранимую, результата нет
29 ноя 13, 17:39    [15214435]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Вопрос, тогда почему сервер не понимает?
я для парамметра @p указываю 'что-то','что-то2'
select не видит параметр
29 ноя 13, 17:41    [15214447]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104751
denis_stell
select не видит параметр

Он видит.
Просто то, как он видит, не совпадает с вашими желаниями.
29 ноя 13, 17:43    [15214468]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Glory,

у меня простые желания, чтобы вместо @p подставилось то что нужно
29 ноя 13, 17:45    [15214479]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
Glory
Member

Откуда:
Сообщений: 104751
denis_stell
у меня простые желания, чтобы вместо @p подставилось то что нужно

В TSQL нет макроподстановок
29 ноя 13, 17:46    [15214490]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
denis_stell
а как можно сделать?
получить с сервера код хранимой процедуры
дописать условие и отправить на сервер в виде запроса
29 ноя 13, 17:48    [15214500]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
sdet
Member

Откуда:
Сообщений: 463
denis_stell
denis_stell
 select a.*,b.name from t1 a,t2 b where a.id=b.id [b]and b.name in (@p)[/b]



Действительно, даже если вручную выполнить хранимую, результата нет


Используйте таблицу как входной параметр
29 ноя 13, 18:13    [15214672]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
sdet,

SELECT из строки, да? :))
29 ноя 13, 18:30    [15214756]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
denis_stell
"and b.name_1 = 'Что-то' or .........."
Как, по-Вашему, живут друг с другом AND и OR?
Что обработается сначала, а что потом?
29 ноя 13, 18:32    [15214770]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
sdet
Member

Откуда:
Сообщений: 463
iap
sdet,

SELECT из строки, да? :))

из таблицы
29 ноя 13, 18:37    [15214803]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
sdet
Member

Откуда:
Сообщений: 463
iap,

ему нужно b.name in (@p)
29 ноя 13, 18:39    [15214811]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Спасибо всем за помощь, вопрос решен.
2 дек 13, 16:43    [15226710]     Ответить | Цитировать Сообщить модератору
 Re: передача динамического параметра в хранимую процедуру  [new]
sdet
Member

Откуда:
Сообщений: 463
denis_stell
Спасибо всем за помощь, вопрос решен.

Вы бы рассказали другим как решен вопрос? А то ведь вопрос можно решить отказавшись от проекта и уволившись
2 дек 13, 17:40    [15227260]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить