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

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

Предача списка в качестве параметра в ХП 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:)

А если серьезно, то откуда берутся эти числа для списка?


Наверх

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