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

Откуда: Пермь
Сообщений: 6
В СУБД FireBird возможно использование конструкций следующего вида:
 
FOR SELECT field1, field2
      FROM table1
      WHERE field3=:const1
      INTO :var1, :var2 
DO BEGIN 
      EXECUTE PROCEDURE proc1(:var1,:var2);
      EXECUTE PROCEDURE proc2(:var1);    
END


При этом построчно извлекаются значения field1, field2 и передаются далее в ХП где происходит последующая обработка.
Суть вопроса заключается в следующем - каким образом можно реализовать аналогичный механизм в MS SQL server?
21 окт 13, 09:35    [15006354]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104751
Константин Розенков
Суть вопроса заключается в следующем - каким образом можно реализовать аналогичный механизм в MS SQL server?

BOL - DECLARE CURSOR
21 окт 13, 09:38    [15006363]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Константин Розенков
Member

Откуда: Пермь
Сообщений: 6
Glory
Константин Розенков
Суть вопроса заключается в следующем - каким образом можно реализовать аналогичный механизм в MS SQL server?

BOL - DECLARE CURSOR


а можно как-то в обход курсоров?
21 окт 13, 09:57    [15006454]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Константин Розенков
а можно как-то в обход курсоров?
Можно.
Переписать процедуры так, чтобы они оперировали набором, а не строкой. Тогда ни циклы, ни курсоры не понадобятся.
21 окт 13, 10:05    [15006492]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104751
Константин Розенков
а можно как-то в обход курсоров?

В смысле ?
Вы просили аналог цикла - вы его получили
Какой еще "в обход" ?
21 окт 13, 10:05    [15006493]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Константин Розенков
Member

Откуда: Пермь
Сообщений: 6
Glory
В смысле ?
Вы просили аналог цикла - вы его получили
Какой еще "в обход" ?


Переформулирую, неужели в ms sql нет иных возможностей реализации циклов, кроме как в рамках курсора?
(да, что есть еще while прекрасно осознаю, но в данном случае в чистом виде его применимость еще более затруднительна)
21 окт 13, 10:24    [15006546]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104751
Константин Розенков
Переформулирую, неужели в ms sql нет иных возможностей реализации циклов, кроме как в рамках курсора?

есть - while
А вот почему вы представляете себе select как цикл непонятно
21 окт 13, 10:27    [15006561]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Sergey Sizov
Member

Откуда:
Сообщений: 1578
Константин Розенков
Glory
В смысле ?
Вы просили аналог цикла - вы его получили
Какой еще "в обход" ?


Переформулирую, неужели в ms sql нет иных возможностей реализации циклов, кроме как в рамках курсора?
Есть, даже уже упомянутые. Работа с набором данных, а не построчно. Откуда такая страсть именно к построчности? Вы можете доказать обязательность построчных циклов?
21 окт 13, 10:28    [15006568]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Константин Розенков
Member

Откуда: Пермь
Сообщений: 6
Попробую еще иначе - нужно произвести какие-то действия на основании результатов select

Sergey Sizov
Работа с набором данных, а не построчно.

Что подразумевается под "набором данных"?
21 окт 13, 10:52    [15006722]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Glory
Member

Откуда:
Сообщений: 104751
Константин Розенков
нужно произвести какие-то действия на основании результатов select

Ну так производите. Почему только для каждой строки результата отдельно ? А не для всех сразу ?
21 окт 13, 10:54    [15006736]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
Константин Розенков
Попробую еще иначе - нужно произвести какие-то действия на основании результатов select

Sergey Sizov
Работа с набором данных, а не построчно.

Что подразумевается под "набором данных"?


результат select и подразумеваетеся
21 окт 13, 10:55    [15006745]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Константин Розенков
Что подразумевается под "набором данных"?
Процедура должна на входе получать набор данных. Для SQL Server 2008 и старше - через табличные параметры, для 2005 и младше - через временные таблицы.
21 окт 13, 11:19    [15006887]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 400
invm
Константин Розенков
Что подразумевается под "набором данных"?
Процедура должна на входе получать набор данных. Для SQL Server 2008 и старше - через табличные параметры, для 2005 и младше - через временные таблицы.


Я действительно не в курсе: подскажите пожалуйста, почему передавать в процедуру табличные переменные лучше, чем временные таблицы?
21 окт 13, 15:19    [15008832]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
Константин Розенков
Glory
В смысле ?
Вы просили аналог цикла - вы его получили
Какой еще "в обход" ?


Переформулирую, неужели в ms sql нет иных возможностей реализации циклов, кроме как в рамках курсора?
(да, что есть еще while прекрасно осознаю, но в данном случае в чистом виде его применимость еще более затруднительна)


Я не понял, что тебе не нравится. У тебя в FB был курсор, и тут тоже курсор.
21 окт 13, 17:42    [15010023]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
Ну, без курсора - еще вариант:
Делаем табличную функцию и применяем cross apply
Если на основании результатов обработки строк нужно
- изменять данные или
- вызывать какие-либо внешние программы,
то внутри табличной функции делаем вызов CLR на C#
или extended stored procedure на C++
(Жаль, что MS забила на C++ ODS API в новых версиях серверов.
Или я что-то не так понял.)
21 окт 13, 17:50    [15010088]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
ART-CODE
Member

Откуда:
Сообщений: 1095
а можно и не табличную, если результат работы не надо на выход подавать в виде набора строк :)
21 окт 13, 17:52    [15010104]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Александр Бердышев
Я действительно не в курсе: подскажите пожалуйста, почему передавать в процедуру табличные переменные лучше, чем временные таблицы?
Ни те, ни другие, в процедуру передать нельзя. Очевидно, вы имели в виду табличный параметр? Ну так они появились начиная с 2008 версии.
И про лучше/хуже речи не было. В процедуре просто можно пользоваться временной таблицей, определенной вне этой процедуры.
21 окт 13, 20:09    [15010611]     Ответить | Цитировать Сообщить модератору
 Re: Построчное извлечение данных из таблицы, с последующей передачей их в ХП  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Glory
Константин Розенков
Переформулирую, неужели в ms sql нет иных возможностей реализации циклов, кроме как в рамках курсора?

есть - while
А вот почему вы представляете себе select как цикл непонятно


Ну может человек DBCC CHECKDB запускает.

2 Константин Розенков,

Вот тебе пример цикла без курсора.

CREATE TABLE tbl_Table_Name_1(Field_One_ID INT IDENTITY(1,1), Field_Two_Data Char(1))
GO
INSERT INTO tbl_Table_Name_1(Field_Two_Data) VALUES ('A'),('B'),('C'),('D'),('E'),('F'),('G'),('H')
GO
DECLARE @im INT = (SELECT MAX(Field_One_ID) FROM tbl_Table_Name_1)
DECLARE @i INT = 0, @c char(1)

WHILE @i <  @im
BEGIN

  SELECT @i = Field_One_ID, @c = Field_Two_Data FROM tbl_Table_Name_1
  WHERE Field_One_ID = (SELECT MIN(Field_One_ID) FROM tbl_Table_Name_1 WHERE Field_One_ID > @i)

  SELECT @i, @c
  -- EXEC my_SP @c
END


Он работает чуть быстрее, но не принципиально.
Если записей не много, то можно использовать курсор, а если хочешь ускорить работу, то лучше перепиши процедуры.

Чудес не бывает.
21 окт 13, 22:00    [15010953]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить