Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2012, 06:58   #1
yaapelsinko
Пользователь
 
Регистрация: 15.01.2012
Сообщений: 67
По умолчанию Последовательности в MSSQL Server 2008

Короче, SQL Server явно делают индусы, иначе как объяснить то, что там ВСЁ заточено на совершение максимального количества бесполезных действий и написание килобайта-двух лишнего кода?

Задача такова: мне надо получить таблицу - числовую последовательность {Начальное значение}...{Начальное значение + Количество - 1}.

Задачу я решил так:

Код:
CREATE FUNCTION [dbo].[GetSequence]
(
	@From int, 
	@Count int
)
RETURNS TABLE
AS
RETURN (WITH [SEQUENCE] AS
         (
          SELECT @From as [ID]
          UNION ALL
          SELECT [ID] + 1 
            FROM [SEQUENCE]
           WHERE [ID] + 1 < @From + @Count
         )
 SELECT [ID]
   FROM [SEQUENCE]
 )
GO
При этом, поскольку кляузу OPTION нельзя использовать в пользовательских функциях, я должен всегда помнить, что вызывать функцию надо, например, так:

SELECT * FROM [dbo].[GetSequence](1, 1000) OPTION(MAXRECURSION 0);

Иначе - максимальная рекурсия не превышает 100 и я не могу вернуть более 100 значений в результирующей таблице.

Ещё при этом - поскольку определение тела табличной функции выглядит как AS RETURN ( ) GO, я обязан использовать строго какой-то неимоверный sql-запрос, я не могу объявить табличную переменную, заполнить её в цикле безо всякой рекурсии и вернуть.

Вопрос в чём - так может есть какой-нибудь способ по человечески, циклом сделать нужную последовательность и веруть как таблицу, чтобы функцию можно было использовать в строке запроса и не париться, что там глубину рекурсии надо указывать не забывать?
yaapelsinko вне форума Ответить с цитированием
Старый 16.06.2012, 11:32   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

По "человечески" c циклами способы есть, вот простейший из них, но наверняка будет медленней, чем вами предложенный
Код:
CREATE FUNCTION [dbo].[GetSequence] (@From int, @Count int) RETURNS @Tabl TABLE (ID int) AS
BEGIN
  DECLARE @i int
  SET @i=0
  WHILE @i<@Count BEGIN
    INSERT INTO @Tabl (ID) VALUES (@From+@i)
    SET @i=@i+1
  END
  RETURN
END
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 16.06.2012 в 11:35.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Экспорт из Excel в MSSQL Server 2005 reihtmonbern Помощь студентам 1 18.04.2011 18:09
PHP 5.3.3 + MSSQL 2008 DimaKGD PHP 2 10.03.2011 14:25
Проверка наличия БД в MSSQL Server из Delphi KillaGorilla БД в Delphi 4 13.01.2011 14:13
Delphi7+MSSQL server sasha198407 БД в Delphi 0 10.01.2011 23:52
MS SQL Server 2008 и Visual Studio 2008 C# (Как работать с БД?) cherw9!40k Базы данных (ADO.NET, LinqToSql, ORM Entity Framework, NHibernate) 2 14.01.2010 20:51