![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Предача списка в качестве параметра в ХП MS SQL [D7, MSSQL]
Ярослав © (2005-06-07 14:11:00)Подскажите как передать в качестве параметра из Delphi ADOCommand
список значений в ХП для использования его в условии:
Where xxxID in (список)
где xxxID - поле типа Int
а список например - 12, 4, 5445, 5423, 22, 666
Я пробовал делать параметр как стороку (@param1 as varchar(8000))
процедура компилируется но при выполнении ругается, что не может переделать verchar в Integer
Как тут быть
Destup (2005-06-07 17:02:00) [1]Приветствую всех.
Начальство поставило задачу срочно изучить хранимые процедуры (MS SQL + Delphi 5) исключительно через TStoredProc (т.е. без ADO и TQuery).
И набросало такой план изучения -
1. Создание и вызов ХП.
2. Передать ХП параметр по ссылке (???)
3. Реализовать и использовать ХП возвращающую курсор.
4. ... возвращающую несколько курсоров.
вроде пока всё.
С первым я справился (хоть раньше на Делфи почти не кодил)
А вот со вторым ... это как ?
StoredProc1.Params.ParamByName('@num').Value := 5;
Это я прямо указал что хочу передать в ХП, а как по ссылке ?
Третье ... что такое курсор я смутно представляю (набор данных возвращаемых sql запросом ?)
Ну написал я StoredProc1.Active := True;
и в DBGrid посыпались данные (курсор ?) через DataSource.
А ... а где мне получить указатель на этот курсор не выводя его в DBGrid ?
А если ХП вернула 2 и более курсоров ?
Весь инет облазил, не нашёл примера.
Помогите кто чем может, желательно маленькими кусочками кода.
Спасибо.
Евгений.
Destup (2005-06-07 17:02:00) [2]ступил
простите ....
Danilka (2005-06-07 16:05:00) [3]А если параметров будет несколько десятков? Может, в этом случае быстрее всего будет записать их в таблицу и соединить с ней?
sniknik (2005-06-07 15:50:00) [4]Ega23 © (07.06.05 14:55) [5]
да скорее всего, и индекс так не будет использоваться и операции со строками... единственный плюс короткая запись, на маленьких таблицах можно использовать.
и разделителя хватит одного кстати, вот так строку если задавать (неизвестно еще откуда она берется)
' 12 4 5445 5423 22 666'
(но естественно не это "главный" тормоз)
да и вообще это как раз тот случай когда параметры лишние (спорили в соседней ветке), составной запрос здесь самое то (имхо).
Zz_ (2005-06-07 15:19:00) [5]http://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
Ega23 (2005-06-07 14:55:00) [6]2 sniknik © (07.06.05 14:43) [4]
Прикольно!
Только долго, походу, будет...
sniknik (2005-06-07 14:43:00) [7]SELECT * FROM Table1
WHERE CHARINDEX(' '+Cast(xxxID AS VarChar(5))+',', :Param) > 0
ParamByName('Param').Value:= ' 12, 4, 5445, 5423, 22, 666,';
Silver Alex (2005-06-07 14:35:00) [8]вот тебе функция в которую можно передать список, например - 12, 4, 5445, 5423, 22, 666. А вернет она тебе набор данных.Использовать можно так.
select id,name from MainTable
where
id in (select id from f_StrToTable('12, 4, 5445, 5423, 22, 666')
CREATE FUNCTION dbo.f_StrToTable (@strID varchar(5000) )
RETURNS @Table table(id int) AS
BEGIN
declare @tmp varchar (5000)
declare @result varchar(1024)
declare @n int
declare @pos int
---------------------
set @n=1
set @pos=1
while @n<=len(@strid)
begin
set @tmp=substring(@strid, @n, 1)
if @tmp=',' -- or @n=len(@strid)
begin
set @result=substring(@strid,@POS, @n-@POS)
insert into @Table(id)
values(CONVERT(VARCHAR(32),@result) )
SET @pos=@n+1
end
if @n=len(@strid)
begin
set @result=substring(@strid,@POS, @n-@POS+1)
insert into @Table(id)
values(CONVERT(VARCHAR(32),@result) )
end
set @n=@n+1
end
return
END
Ega23 (2005-06-07 14:35:00) [9]:о)
Только что коллеге объяснял, как делается...
CREATE PROCEDURE S_MyProc
@Where varchar (2000)
as
Declare @SQLMain varchar(8000)
Set @SQLMain='Select * from Table 1 where xxxID in ('+@where'+')'
exec(@SQLMain)
return(0)
GO
-=XP=- (2005-06-07 14:17:00) [10]Вся проблема тут: 666:)
А если серьезно, то откуда берутся эти числа для списка?