Передать массив в SQL 6.5

MadMaster
Дата: 11.08.2000 05:42:06
Возникла небольшая проблема - передавть не отдельные параметры во встроенную процедуру, а сразу массив, скажем бинарный. Сделать это нужно из Delphi 4.0. Полагаю, можно воспользоваться типами Binary и Varbinary. Подскажите, пожалуйста, кто встречался с анналогичной проблемой.
SergSuper
Дата: 11.08.2000 08:26:09
Передать-то массив в виде Binary или Varbinary можно, но как потом с этим работать? Нормальных функций для работы с такими данными в SQL нет, да он для этого и не предназначен.
Я бы предложил два варианта:
1. Передается строка с списком чисел через, допустим, запятую. Например "1,3,5,7,9". Внутри процедуры можно проверить, есть ли это число в строке: if ','+convert(varchar(5),n)+',' like ','+@s+',' ...
@s - это передаваемая строка, n - поле в таблице для проверки
Естественно это хорошо если значений не так много и все они где-то уже есть
2. Создать таблицу, где одна колонка будет некий уникальный для набора данных ключ, заполнять эту таблицу отдельно, а потом передавать процедуре как параметр этот ключ.

Я понимаю что хочется красиво, передать массив, как в паскале. Не получиться. Тут всё не так, мышление надо несколько менять.
AlexSol
Дата: 12.10.2000 11:00:55
На самом деле нужно сочетать 1 и 2 способ.
передавать строку типа '1,2,12,34,11111'
в sp,
создавать в ней временную таблицу
и, в цикле писать в нее
(разобранные в том же цикле с использованием строковых функций)
1 потом 2 и т.д
Ну а потом INNER JOIN и ура.
++
Локальное приложение работает только на генерацию строки
и на обработку полученного рез-та.
сеть разгружается...
AlexSol
Дата: 12.10.2000 11:01:13
На самом деле нужно сочетать 1 и 2 способ.
передавать строку типа '1,2,12,34,11111'
в sp,
создавать в ней временную таблицу
и, в цикле писать в нее
(разобранные в том же цикле с использованием строковых функций)
1 потом 2 и т.д
Ну а потом INNER JOIN и ура.
++
Локальное приложение работает только на генерацию строки
и на обработку полученного рез-та.
сеть разгружается...
AlexSol
Дата: 12.10.2000 11:01:37
На самом деле нужно сочетать 1 и 2 способ.
передавать строку типа '1,2,12,34,11111'
в sp,
создавать в ней временную таблицу
и, в цикле писать в нее
(разобранные в том же цикле с использованием строковых функций)
1 потом 2 и т.д
Ну а потом INNER JOIN и ура.
++
Локальное приложение работает только на генерацию строки
и на обработку полученного рез-та.
сеть разгружается...
Ольга
Дата: 12.10.2000 13:22:34
Во временную таблицу можно писать не в цикле, если воспользоваться оператором EXEC, параметр которого формировать из входного параметра-строки процедуры. Например, если мы передаем входной параметр @arraypar в виде '1,3,5,7,9', то это будет выглядеть так:
exec('insert #ttt (field1) select '+replace(@arraypar,',',' union select '))

В принципе, в качестве входного параметра можно передавать уже готовую строку в виде:
select 1
union
select 3
union
select 5
union
select 7
union
select 9
Ольга
Дата: 12.10.2000 13:22:37
Во временную таблицу можно писать не в цикле, если воспользоваться оператором EXEC, параметр которого формировать из входного параметра-строки процедуры. Например, если мы передаем входной параметр @arraypar в виде '1,3,5,7,9', то это будет выглядеть так:
exec('insert #ttt (field1) select '+replace(@arraypar,',',' union select '))

В принципе, в качестве входного параметра можно передавать уже готовую строку в виде:
select 1
union
select 3
union
select 5
union
select 7
union
select 9
Ольга
Дата: 12.10.2000 13:22:53
Во временную таблицу можно писать не в цикле, если воспользоваться оператором EXEC, параметр которого формировать из входного параметра-строки процедуры. Например, если мы передаем входной параметр @arraypar в виде '1,3,5,7,9', то это будет выглядеть так:
exec('insert #ttt (field1) select '+replace(@arraypar,',',' union select '))

В принципе, в качестве входного параметра можно передавать уже готовую строку в виде:
select 1
union
select 3
union
select 5
union
select 7
union
select 9
Ольга
Дата: 12.10.2000 13:22:54
Во временную таблицу можно писать не в цикле, если воспользоваться оператором EXEC, параметр которого формировать из входного параметра-строки процедуры. Например, если мы передаем входной параметр @arraypar в виде '1,3,5,7,9', то это будет выглядеть так:
exec('insert #ttt (field1) select '+replace(@arraypar,',',' union select '))

В принципе, в качестве входного параметра можно передавать уже готовую строку в виде:
select 1
union
select 3
union
select 5
union
select 7
union
select 9
Ольга
Дата: 12.10.2000 13:23:31
Во временную таблицу можно писать не в цикле, если воспользоваться оператором EXEC, параметр которого формировать из входного параметра-строки процедуры. Например, если мы передаем входной параметр @arraypar в виде '1,3,5,7,9', то это будет выглядеть так:
exec('insert #ttt (field1) select '+replace(@arraypar,',',' union select '))

В принципе, в качестве входного параметра можно передавать уже готовую строку в виде:
select 1
union
select 3
union
select 5
union
select 7
union
select 9