Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
ВнизПредача списка в качестве параметра в ХП MS SQL Найти похожие ветки
← →
Ярослав (2005-06-07 14:11) [0]Подскажите как передать в качестве параметра из Delphi ADOCommand
список значений в ХП для использования его в условии:
Where xxxID in (список)
где xxxID - поле типа Int
а список например - 12, 4, 5445, 5423, 22, 666
Я пробовал делать параметр как стороку (@param1 as varchar(8000))
процедура компилируется но при выполнении ругается, что не может переделать verchar в Integer
Как тут быть
← →
-=XP=- © (2005-06-07 14:17) [1]Вся проблема тут: 666 :)
А если серьезно, то откуда берутся эти числа для списка?
← →
Silver Alex © (2005-06-07 14:35) [2]вот тебе функция в которую можно передать список, например - 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) [3]:о)
Только что коллеге объяснял, как делается...
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
← →
sniknik © (2005-06-07 14:43) [4]SELECT * FROM Table1
WHERE CHARINDEX(" "+Cast(xxxID AS VarChar(5))+",", :Param) > 0
ParamByName("Param").Value:= " 12, 4, 5445, 5423, 22, 666,";
← →
Ega23 © (2005-06-07 14:55) [5]2 sniknik © (07.06.05 14:43) [4]
Прикольно!
Только долго, походу, будет...
← →
Zz_ (2005-06-07 15:19) [6]http://www.sql.ru/articles/mssql/03060701ArraysAndListsInSQLServer.shtml
← →
sniknik © (2005-06-07 15:50) [7]Ega23 © (07.06.05 14:55) [5]
да скорее всего, и индекс так не будет использоваться и операции со строками... единственный плюс короткая запись, на маленьких таблицах можно использовать.
и разделителя хватит одного кстати, вот так строку если задавать (неизвестно еще откуда она берется)
" 12 4 5445 5423 22 666"
(но естественно не это "главный" тормоз)
да и вообще это как раз тот случай когда параметры лишние (спорили в соседней ветке), составной запрос здесь самое то (имхо).
← →
Danilka © (2005-06-07 16:05) [8]А если параметров будет несколько десятков? Может, в этом случае быстрее всего будет записать их в таблицу и соединить с ней?
← →
Destup (2005-06-07 17:02) [9]Приветствую всех.
Начальство поставило задачу срочно изучить хранимые процедуры (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) [10]ступил
простите ....
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.07.18;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c