Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Возникла проблема передачи из Reporting Services 2005 параметра, типа массив, в хранимую процедуру в MS SQL Server 2005.
Есть некая процедура:
CREATE PROCEDURE [dbo].[ddd]
@Fdata datetime,@Ldata datetime,@Proba int
AS
BEGIN
    SELECT  Artikul,proba,data
    FROM  main.dbo.jornal       
    WHERE  data>=@Fdata and data<=@Ldata and Proba in (@Proba)
END

Параметр @Proba, пользователь выбирает сам ввиде галочки в Reporting Services. Он может выбрать три пробы, четыре пробы. Прочитал посты на эту тему не совсем понял..
17 авг 09, 12:51    [7545867]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Массивы и Списки в SQL Server
17 авг 09, 12:52    [7545874]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Рекомендую также подумать над тем, не нужно ли заменить
minya13_85
and data<=@Ldata and
на
and data<@Ldata and
Вам, конечно, виднее, задача Ваша
Просто у меня каждый раз когда я такое вижу, рождается подозрение - а нет ли тут ошибки
Скорее всего, конечно, это лишние страхи, но на всякий случай проверьте...
17 авг 09, 12:55    [7545898]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Паганель
Рекомендую также подумать над тем, не нужно ли заменить
minya13_85
and data<=@Ldata and
на
and data<@Ldata and
Вам, конечно, виднее, задача Ваша
Просто у меня каждый раз когда я такое вижу, рождается подозрение - а нет ли тут ошибки
Скорее всего, конечно, это лишние страхи, но на всякий случай проверьте...
на самом деле это просто пример, а вообще я использую так
datediff(d,data,@Ldata)>=0
и насчет ссылки, там примеры для 2000, в 2005 там также будет? а как передаются в RS2005 multivalue? тоже через запятую?
17 авг 09, 13:05    [7545943]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
minya13_85
там примеры для 2000, в 2005 там также будет?
Попробуйте, скорее всего да
Если что-то не будет получаться - пишите, поможем

minya13_85
а как передаются в RS2005 multivalue? тоже через запятую?
ну вот смотрите
возьмем к примеру пункт "5.1. Список integer элементов"
Там ведь исходник функции iter_intlist_to_table дан
Вы видите, что она использует в качестве разделителей?
Там даже черным по русски написано
Массивы и Списки в SQL Server
для списка integer значений запятая как разделитель в действительности не играет никакой роли.
Поэтому при написании функции я выбрал вместо запятой пробел в качестве разделителя.
17 авг 09, 13:14    [7546011]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
minya13_85
а вообще я использую так
datediff(d,data,@Ldata)>=0
Вот так не надо. Индексы по [data] будет невозможно использовать
17 авг 09, 14:04    [7546314]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
iap
minya13_85
а вообще я использую так
datediff(d,data,@Ldata)>=0
Вот так не надо. Индексы по [data] будет невозможно использовать
опа.. не знал. а как тогда, чтобы захватить и последний выбранный день полностью?
17 авг 09, 14:07    [7546341]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
minya13_85
захватить и последний выбранный день полностью
это значит меньше нуля часов следующего за "последним выбранным" дня
17 авг 09, 14:11    [7546382]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Паганель
ну вот смотрите
возьмем к примеру пункт "5.1. Список integer элементов"
Там ведь исходник функции iter_intlist_to_table дан
Вы видите, что она использует в качестве разделителей?
Там даже черным по русски написано
Массивы и Списки в SQL Server
для списка integer значений запятая как разделитель в действительности не играет никакой роли.
Поэтому при написании функции я выбрал вместо запятой пробел в качестве разделителя.
на самом деле разделители играют роль в RS2005, там параметр multiValue, передается через запятую. когда был пробел у меня не срабатывало, поставил запятую всё заработало. Только я не понял, где в этой функции список integer элементов??
17 авг 09, 14:11    [7546383]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Паганель
minya13_85
захватить и последний выбранный день полностью
это значит меньше нуля часов следующего за "последним выбранным" дня
Data<@Ldata+1? хотя что он прибавит к дате: часы, дни, минуты..(((
17 авг 09, 14:12    [7546397]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
minya13_85
где в этой функции список integer элементов??
в примере ее использования:
Массивы и Списки в SQL Server
EXEC get_product_names_iter '9 12 27 37'
17 авг 09, 14:13    [7546407]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
minya13_85
когда был пробел у меня не срабатывало, поставил запятую всё заработало
Я только что создал у себя эту функцию методом копипаста и попробовал сделать то, что Вы написали
Результат с точностью до наоборот:
select * from iter_intlist_to_table('1 2')
select * from iter_intlist_to_table('1,2')

listpos     number
----------- -----------
1           1
2           2

(2 row(s) affected)

listpos     number
----------- -----------
Msg 245, Level 16, State 1, Line 2
Conversion failed when converting the nvarchar value '1,2' to data type int.
17 авг 09, 14:16    [7546433]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Паганель
minya13_85
когда был пробел у меня не срабатывало, поставил запятую всё заработало
Я только что создал у себя эту функцию методом копипаста и попробовал сделать то, что Вы написали

Т.е. вы без изменения текста функции рассчитываете, что она сама начнет понимать запятую как разделитель ?
17 авг 09, 14:18    [7546454]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
minya13_85
хотя что он прибавит к дате: часы, дни, минуты..(((
Это очень легко увидеть по резльтатам простейшего эксперимента:
select getdate() as src
      ,getdate() + 1 as result

src                     result
----------------------- -----------------------
2009-08-17 13:18:06.307 2009-08-18 13:18:06.307

(1 row(s) affected)
Но в идеале, конечно, почитать, как рекомендуется находить начало следующих суток в документации и FAQ
17 авг 09, 14:19    [7546465]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
minya13_85
iap
minya13_85
а вообще я использую так
datediff(d,data,@Ldata)>=0
Вот так не надо. Индексы по [data] будет невозможно использовать
опа.. не знал. а как тогда, чтобы захватить и последний выбранный день полностью?
DECLARE @Ldata DATETIME;
SET @Ldata='20090817';           /*Это день, до которого включительно надо получить данные из таблицы*/
SET @Ldata=DATEADD(DAY,1,@Ldata);/*Добавляем один день. Теперь нас интересуют данные до 0 ч. этого дня*/

SELECT  Artikul,proba,data
FROM  main.dbo.jornal       
WHERE data>=@Fdata AND data<@Ldata;
При этом совершенно не мешает ненулевое время в [data].
А ограничение, налагаемое на поле, а не на функцию, позволяет использовать индекс по этому полю.
17 авг 09, 14:20    [7546476]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Glory
Т.е. вы без изменения текста функции рассчитываете, что она сама начнет понимать запятую как разделитель ?
Если это вопрос ко мне, то я - не рассчитываю
Я пытаюсь сказать автору, что раз уж он поменял функцию, то все вопросы по поводу ее работы теперь к нему
По крайней мере до тех пор, пока он не скажет - что он с ней сделал
17 авг 09, 14:21    [7546482]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Паганель
По крайней мере до тех пор, пока он не скажет - что он с ней сделал


ALTER FUNCTION [dbo].[Proba_Vibor] (@Proba ntext)
RETURNS 
@tbl TABLE 
(listpos int IDENTITY(1, 1) NOT NULL,number  int NOT NULL)
AS
BEGIN
	DECLARE @pos      int,
              @textpos  int,
              @chunklen smallint,
              @str      nvarchar(4000),
              @tmpstr   nvarchar(4000),
              @leftover nvarchar(4000)

      SET @textpos = 1
      SET @leftover = ''
      WHILE @textpos <= datalength(@Proba) / 2
      BEGIN
         SET @chunklen = 4000 - datalength(@leftover) / 2
         SET @tmpstr = ltrim(@leftover + substring(@Proba, @textpos, @chunklen))
         SET @textpos = @textpos + @chunklen

         SET @pos = charindex(',', @tmpstr)
         WHILE @pos > 0
         BEGIN
            SET @str = substring(@tmpstr, 1, @pos - 1)
            INSERT @tbl (number) VALUES(convert(int, @str))
            SET @tmpstr = ltrim(substring(@tmpstr, @pos + 1, len(@tmpstr)))
            SET @pos = charindex(',', @tmpstr)
         END

         SET @leftover = @tmpstr
      END

      IF ltrim(rtrim(@leftover)) <> ''
         INSERT @tbl (number) VALUES(convert(int, @leftover))
	RETURN 
END

и насчет integer. В процедуре мне надо указывать тип данных уже не integer, а ntext или varchar(10).
и в самом RS2005 тип тоже менять на String приходится.
17 авг 09, 14:27    [7546523]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
minya13_85
         SET @pos = charindex(',', @tmpstr)
Так Вы же сами изменили функцию так, чтобы разделителем была запятая, а потом спрашиваете
minya13_85
а как передаются в RS2005 multivalue? тоже через запятую?



minya13_85
В процедуре мне надо указывать тип данных уже не integer, а ntext или varchar(10).
и в самом RS2005 тип тоже менять на String приходится.
Там по ссылке есть также пункт "5.2. Список string элементов"
Это то, что Вам нужно?
17 авг 09, 14:31    [7546565]     Ответить | Цитировать Сообщить модератору
 Re: Передать массив в процедуру?  [new]
minya13_85
Member

Откуда: Москва
Сообщений: 598
Паганель
Так Вы же сами изменили функцию так, чтобы разделителем была запятая, а потом спрашиваете
Ну я изменил, т.к. на пробел RS2005 ругался... как поставил запятую, так все прошло гладко. В общем теперь все работает, спасибо за помощь. И насчет даты, спасибо что предупредили, буду править.
17 авг 09, 14:36    [7546611]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить