Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите с хранимой процедурой  [new]
NasonovYA
Member

Откуда:
Сообщений: 13
У меня в базе данных есть большая таблица характеристик систем-на-кристалле. необходимо написать хранимую процедуру для поиска по нескольким параметрам. проблема в то что скажем из 10 предложенных параметров пользователь может выбрать на свое усмотрение любое количество, но не меньше одного.
вот как написать хранимку для одного параметра я знаю, как для нескольких тоже не проблема (при условии что они обязательно все должны соблюдаться), а как сделать так чтобы хранимка сама определяла по каким параметрам ей искать?
вот код для поиска по одному параметру:

create procedure Proc1_find
@name varchar (50)
as
select id, manufacture
from dbo.Xilinx
where manufacture = @name
go
11 окт 09, 11:17    [7770091]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
miksoft
Member

Откуда:
Сообщений: 38314
Скажите, какая у вас СУБД (ибо на MySQL не похоже), и я перенесу топик в нужный подфорум.
11 окт 09, 11:26    [7770095]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
NasonovYA
Member

Откуда:
Сообщений: 13
SQL 2008
Модератор: Тема перенесена из форума "MySQL".


Сообщение было отредактировано: 11 окт 09, 21:47
11 окт 09, 21:44    [7770715]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
CREATE PROCEDURE Proc1_find @name VARCHAR(50)=NULL, @Param1 INT=NULL, @Param2 INT=NULL AS
SELECT id, manufacture
FROM dbo.Xilinx
WHERE (@name   IS NULL OR manufacture=@name)
  AND (@Param1 IS NULL OR Field1=@Param1)
  AND (@Param2 IS NULL OR Field2=@Param2);
GO
Правда, в таком стиле невозможно задать поиск полей, которые должны быть IS NULL
11 окт 09, 21:57    [7770745]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
Ох...ий программизд
Guest
Если количество параметров всегда жестко задано, то вариант iap оптимален. Заведите процедуру с десятью входными параметрами и все.
А если максимальное количество параметров часто меняется, например сегодня 10, а завтра 200, то лучше передавать параметры в процедуру через xml, например так:
create procedure Proc1_find @xml nvarchar(max) as
 declare @hdoc int
 exec sp_xml_preparedocument @hdoc output, @xml

 --тут получаем список имен параметров и их значений
 -- для наглядности закинем их в табличную переменную
 declare @params (ParamName nvarchar(100), ParamValue varchar(50))
 insert @params (ParamName, ParamValue)
 select ParamName, ParamValue
 from openxml(@hdoc,'Root/Params', 1)
 with (ParamName nvarchar(100), ParamValue varchar(50))

 exec sp_xml_removedocument @hdoc
 /* ну а дальше делаете с вашими параметрами что хотите,
  например строите поисковый запрос в динамике
 declare @sql nvarchar(max)
  set @sql = 'select ' +... ну и т. д.*/
go	

Вызов процедуры будет выглядеть примерно так:
exec Proc1_find N'
<Root>
 <Params ParamName="Param1" ParamValue="91"/>
 <Params ParamName="Param2" ParamValue="487"/>
 <Params ParamName="Param3" ParamValue="125"/>
 <Params ParamName="Param183" ParamValue="974"/>
</Root>'
12 окт 09, 07:13    [7771104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Ох...ий программизд,

В таком случае можно рассмотреть и заполнение временной таблицы именами и значениями параметров, а в процедуре строить динамический запрос.
Поскольку сервер 2008-й, то же самое можно сделать, передавая в качестве параметра табличную переменную. Правда, предварительно придётся
создать пользовательский тип данных.

Вместо XML можно передавать и простую строку параметров с разделителем, а внутри его парсить.

Наконец, можно почитать вот это: Массивы и Списки в SQL Server
12 окт 09, 08:47    [7771190]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
Ох...ий программизд
Guest
iap,

Ну конечно же все это тоже можно :) Только вот заполнение временной таблицы параметрами неудобно реализовывать с клиента, то же самое и с табличной переменной.

Я привел один-единственный пример только для демонстрации, что можно сделать, если максимальное кол-во параметров меняется.

В связи с этим прошу читать мое сообщение так:
Ох...ий программизд
...если максимальное количество параметров часто меняется, например сегодня 10, а завтра 200, то, в числе прочих возможностей можно передавать параметры в процедуру через xml...
12 окт 09, 09:42    [7771335]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
NasonovYA
Member

Откуда:
Сообщений: 13
iap
CREATE PROCEDURE Proc1_find @name VARCHAR(50)=NULL, @Param1 INT=NULL, @Param2 INT=NULL AS
SELECT id, manufacture
FROM dbo.Xilinx
WHERE (@name   IS NULL OR manufacture=@name)
  AND (@Param1 IS NULL OR Field1=@Param1)
  AND (@Param2 IS NULL OR Field2=@Param2);
GO
Правда, в таком стиле невозможно задать поиск полей, которые должны быть IS NULL

чето я не понял, а как в таком случае задавать параметры? получается тут важен порядок?
если я на первом месте не пишу значение поля manufacture, а пишу скажем значение поля field1? то выдается ошибка. потому как сначала хранимка ищет параметр manufacture.
вот пример запроса:

exec Proc1_find [Xilinx] - в таком случае выводится правильный результат
а если так exec Proc1_find [100] то ошибка хотя число 100 явялется значением поля Field1
12 окт 09, 20:58    [7775452]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
NasonovYA
Member

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

и просьба объясняться попроще, я новичок)
12 окт 09, 21:00    [7775453]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
NasonovYA
Member

Откуда:
Сообщений: 13
NasonovYA,
до меня доперло, просто вместо "пустых" параметров нужно будет указывать NULL!
12 окт 09, 21:29    [7775495]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
iap
Member

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

параметры можно задавать не только по порядку в списке, но и по имени. Например:
EXECUTE Proc1_find @name='Xilinx', @Param2=33;
@Param1 при этом IS NULL получается (потому что default значение, ибо не задан при вызове).
12 окт 09, 22:08    [7775581]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с хранимой процедурой  [new]
NasonovYA
Member

Откуда:
Сообщений: 13
всем спасибо. хранимку для поиска написал на основе идеи выдвинутой iap.
12 окт 09, 23:50    [7775856]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить