Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Хочу сделать запрос типа: declare @s --переменная @s должна быть массивом n-целых чисел set @s=1,2,..., n select * from Table where id in (@S) Может кто знает как выполнить подоный запрос, в BOL по поводу как объявлять массив не нашел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 14:39 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Таблица - лучший массив, таблица - лучше чем массив! select * from Table where id in (select id from Table2) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 14:47 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Не могу в данном случае использовать таблицу, т.к. на входе есть только переменная строковая типа '1,2,3...n' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 14:50 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Массивов нет. 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 (если значения во входном параметре не повторяются) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 14:56 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Напишите процедуру(а лучше функцию) разбора списков и превращения их в таблицы, во-первых интересно, во-вторых все равно придется писать, если собираетесь достаточно долго программировать на T-SQL. Со временем появится свой джентльменский набор, как, например, функция [число в сумму прописью]. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 15:00 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 15:11 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
г.Абдулин, Вы просто solution man. Ну неинтересно же... Пусть новобранец хоть полдня понапрягался бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 15:23 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Предложу и я свой вариант 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2001, 15:32 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
ну тогда и я свой: 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,',') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2001, 07:06 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
А у нас такой используется: 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2001, 07:37 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
А слона то я и не заметил... Есть ещё один простенький вариант: declare @s VARCHAR(4000) Пусть @s будет вида '1,2,3,5,10,28,4' , то есть числа с разделителем select * from Table where CHARINDEX(','+CONVERT(VARCHAR,id)+',' , ','+@s+',') <> 0 Он не такой быстрый, как связь с таблицей, но для кластерного id вполне приемлемый ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2001, 08:59 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
5+ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2001, 09:03 |
|
||
|
Если возможность в SQL использовать массивы
|
|||
|---|---|---|---|
|
#18+
Действительно, лаконично. Но из всех этих вариантов я теперь выбрал вариант с функцией от SergeSuper, возвращающей таблицу, где таблица генерится моим циклом. Вариант с временной таблицей самый дорогой. Лаконичный вариант не так уж и лаконичен, если принять во внимание, что функция написана один раз, а может испоьзоваться в самых разных подобных запросах, и более эффективна. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2001, 08:27 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32019983&tid=1824449]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 246ms |
| total: | 396ms |

| 0 / 0 |
