Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Если возможность в SQL использовать массивы / 14 сообщений из 14, страница 1 из 1
27.12.2001, 14:39
    #32019949
Sergy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
Хочу сделать запрос типа:
declare @s --переменная @s должна быть массивом n-целых чисел
set @s=1,2,..., n
select * from Table where id in (@S)

Может кто знает как выполнить подоный запрос, в BOL по поводу как объявлять массив не нашел.
...
Рейтинг: 0 / 0
27.12.2001, 14:47
    #32019951
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
Таблица - лучший массив, таблица - лучше чем массив!
select * from Table where id in (select id from Table2)
...
Рейтинг: 0 / 0
27.12.2001, 14:50
    #32019952
Sergy
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
Не могу в данном случае использовать таблицу, т.к. на входе есть только переменная строковая типа '1,2,3...n'
...
Рейтинг: 0 / 0
27.12.2001, 14:56
    #32019954
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
Массивов нет.

1 Вариант
Если параметр передается из клиентского приложения

declare @s varchar(1000)
declare @sql varchar(1000)
set @s='1,2,..., n'
set @sql = 'select * from Table where id in (' + @S +')'
exec(@sql)

2 Вариант
Разбор входного параметра, преобразование его в таблицу и далее как посоветовал MadDog или
select * from Table inner join Table2 on Table2.id = Table1.id (если значения во входном параметре не повторяются)
...
Рейтинг: 0 / 0
27.12.2001, 15:00
    #32019957
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
Напишите процедуру(а лучше функцию) разбора списков и превращения их в таблицы, во-первых интересно, во-вторых все равно придется писать, если собираетесь достаточно долго программировать на T-SQL. Со временем появится свой джентльменский набор, как, например, функция [число в сумму прописью].
...
Рейтинг: 0 / 0
27.12.2001, 15:11
    #32019958
Если возможность в SQL использовать массивы
declare @values table(
a int not null primary key
)
declare @dwas bit
declare @i int
declare @c CHAR
set @dwas = 0
set @i = 0
while @s <> ''
begin
set @c = LEFT(@s, 1)
set @s = RIGHT(@s, LEN(@s) - 1)
if (@c >= '0') and (@c <= '9')
begin
set @i = @i * 10 + (ASCII(@c) - ASCII('0'))
set @dwas = 1
end
else
begin
if @dwas <> 0
begin
insert into @values(a) values(@i)
set @i = 0
set @dwas = 0
end
end
end

select "Id" FROM Table WHERE Id IN (SELECT a FROM @values)
...
Рейтинг: 0 / 0
27.12.2001, 15:23
    #32019959
MadDog
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
г.Абдулин, Вы просто solution man. Ну неинтересно же...
Пусть новобранец хоть полдня понапрягался бы.
...
Рейтинг: 0 / 0
27.12.2001, 15:32
    #32019960
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
Предложу и я свой вариант


declare @s varchar(100)
declare @sql varchar(8000)
set @s = '1, 2, 3, 4'
set @sql = 'insert into #temp1 select * from (SELECT ' + replace(@s, ',', ' AS id UNION ALL SELECT ') + ') AS a'
create table #temp1(id int)
exec(@sql)
select * from #temp1
drop table #temp1
...
Рейтинг: 0 / 0
28.12.2001, 07:06
    #32019983
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
ну тогда и я свой:

CREATE FUNCTION StrToArray (@StrValue varchar(8000), @Delimiter varchar(10))
RETURNS @array TABLE (ID int, CharValue varchar(8000))
AS
BEGIN
declare @p int, @s int, @id int, @v varchar(8000)
select @s=datalength(@Delimiter), @id=0, @v=@StrValue
if @s = 0 return
select @p=patindex('%'+@Delimiter+'%',@v)
while @p > 0
begin
insert @array select @id, ltrim(rtrim(substring(@v,1,@p-1)))
select @v=substring(@v,@p+@s,8000)
select @p=patindex('%'+@Delimiter+'%',@v), @id=@id+1
end
insert @array select @id, ltrim(rtrim(@v))
delete @array where CharValue='' or CharValue is null
RETURN
END

go

declare @s vrchar(222)
select @s='123,123,444'

select convert(int,CharValue ) from dbo.StrToArray(@s,',')
...
Рейтинг: 0 / 0
28.12.2001, 07:37
    #32019991
Если возможность в SQL использовать массивы
А у нас такой используется:

declare @GoodsStr varchar(255), @nIndex int
set @GoodsStr='2,4,7,4,9'
create table #goods (Id int NOT NULL)
set @nIndex = charindex(',', @GoodsStr)
while @nIndex>0
begin
insert into #goods values(convert(int, ltrim(left(@GoodsStr, @nIndex-1))))
Set @GoodsStr = substring(@GoodsStr, @nIndex+1, datalength(@GoodsStr)-@nIndex)
Set @nIndex = charindex(',', @GoodsStr)
end
insert into #goods values(convert(int, ltrim(@GoodsStr)))
select * from #goods
drop table #goods
...
Рейтинг: 0 / 0
28.12.2001, 08:59
    #32020001
Arty
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
А слона то я и не заметил... Есть ещё один простенький вариант:

declare @s VARCHAR(4000)
Пусть @s будет вида '1,2,3,5,10,28,4' , то есть числа с разделителем
select * from Table
where CHARINDEX(','+CONVERT(VARCHAR,id)+',' , ','+@s+',') <> 0
Он не такой быстрый, как связь с таблицей, но для кластерного id вполне приемлемый
...
Рейтинг: 0 / 0
28.12.2001, 09:03
    #32020002
Если возможность в SQL использовать массивы
5+
...
Рейтинг: 0 / 0
29.12.2001, 08:27
    #32020052
Если возможность в SQL использовать массивы
Действительно, лаконично.

Но из всех этих вариантов я теперь выбрал
вариант с функцией от SergeSuper, возвращающей таблицу, где таблица генерится моим циклом.

Вариант с временной таблицей самый дорогой.
Лаконичный вариант не так уж и лаконичен, если принять во внимание, что функция написана один раз, а может испоьзоваться в самых разных подобных запросах, и более эффективна.
...
Рейтинг: 0 / 0
29.12.2001, 08:48
    #32020055
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Если возможность в SQL использовать массивы
А зачем массивы ? Делаешь временную таблицу, загоняешь туда чего хочешь, потом в запросе inner join эта таблица и готово
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Если возможность в SQL использовать массивы / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]