Табличные функции и временные таблицы в Transact-SQL

Сегодня мы поговорим об очень полезном функционале языка Transact-SQL — это табличные функции. Так как у нас сайт для начинающих программистов, а такие программисты по началу боятся использовать табличные функции или просто не знают, зачем они нужны. Поэтому я решил рассказать про основы создания таких функций. А также рассказать про использование временных таблиц в процедурах или SQL инструкциях.

Табличные функции в Transact-SQL – описание и примеры создания

Раньше мы уже знакомились с функциями, которые возвращают таблицу, правда, на языке PL/pgSQL для сервера PostgreSQL (Написание табличной функции на PL/pgSQL). Теперь пришло время поговорить о такой реализации на Transact-SQL.

Вспомним, а для чего нам вообще нужны такие функции. Самый простой ответ на этот вопрос это то, что в таких функциях можно программировать (объявлять переменные, выполнять какие-то расчеты) и передавать параметры внутрь этой функции, как в обычных скалярных функциях, а результат получать в виде таблицы. И это хорошо, ведь в представлениях (вьюхах) этого делать нельзя, а процедура ничего не возвращает (можно сделать, чтобы возвращала, но это в большинстве случае не очень удобно).

Пример создания простой табличной функции

Итак, приступим, для начала приведем самый простой вариант реализации такой функции. Допустим, нам нужно выбрать несколько полей из таблицы по определенному критерию.

Примечание! Данный пример можно реализовать и с помощью представления. Но мы пока только учимся писать такие функции.

   
   --название нашей функции
   CREATE FUNCTION [dbo].[fun_test_tabl]  
   (    
   --входящие параметры и их тип
   @id INT
   )
   --возвращающее значение, т.е. таблица
   RETURNS TABLE
   AS
   --сразу возвращаем результат
   RETURN 
   (
        --сам запрос
        SELECT * FROM table WHERE id = @id
   )
   GO

В итоге мы создали функцию, в которую будем передавать один параметр id, его мы используем в условии исходного SQL запроса.

Получить данные из этой функции можно следующим образом:

   
   SELECT * FROM dbo.fun_test_tabl (1)

Как видите все проще простого. Теперь давайте создадим функцию уже с использованием программирования в этой функции.

Пример создания табличной функции, в которой можно программировать

   
   --название нашей функции
   CREATE FUNCTION [dbo].[fun_test_tabl_new]  
   (    
   --входящие параметры
   @number INT
   )
   --возвращающее значение, т.е. таблица с перечислением полей и их типов
   RETURNS @tabl TABLE (id INT, number INT, summa MONEY)
   AS
   BEGIN
           --объявляем переменные
           DECLARE @var MONEY
           --выполняем какие-то действия на Transact-SQL
           IF @number >=0 
           BEGIN 
                SET @var=1000
           END
           ELSE
                        SET @var=0
                --вставляем данные в возвращающий результат
                INSERT @tabl
                        SELECT id, number, summa 
                        FROM tabl 
                        WHERE summa > @var
           --возвращаем результат
           RETURN 
   END


Здесь мы уже программируем и можем выполнять любые действия как в обычных функциях и процедурах, при этом получая результат в виде таблицы. В этом примере мы передаем один параметр внутрь нашей функции (их может быть несколько!), внутри функции мы уже смотрим, что за параметр к нам пришел, и на основе этого уже формируем условие для запроса. Как Вы понимаете это тоже простой пример, но можно писать очень и очень сложные алгоритмы как в процедурах, именно поэтому, и созданы эти табличные функции.

Теперь давайте обратимся к нашей функции, например, вот так

   
   SELECT * FROM dbo.fun_test_tabl_new (1)

Временные таблицы в Transact-SQL — описание и пример создания

В дополнение к табличным функциям я хочу рассказать еще о возможности использования временных таблиц, которые также иногда очень сильно помогают выполнять поставленные задачи.

Например, в процедуре Вам необходимо выполнять много расчетов и запоминать их результат, а создавать дополнительные представления, табличные функции или вообще таблицы, которые потом нужно удалять, так как они Вам после выполнения процедуры будут не нужны, Вам просто не охота, да и это не очень удобно. Поэтому в Microsoft SQL Server существует такая возможность как «Временные таблицы». Давайте научимся их создавать. А создавать и использовать их очень просто, например, в коде своей процедуры, Вы хотите сохранить результат в таблицу, для этого просто создаете эту таблицу вот так (перед названием таблицы ставится знак решетки #).

   
   CREATE TABLE #tmp(column1 INT, column2 INT, column3 MONEY)
        INSERT INTO #tmp(column1, column2, column3)
                SELECT data1, data2, data3 
                FROM table
   --Затем по коду ниже Вы ее можете использовать, а в конце процедуры удалить ее 
   DROP TABLE #tmp

Таким образом, у Вас в базе фактически таблица не будет создана (и Вы ее нигде не увидите и, соответственно, не сможете обратиться к ней), она будет создана только для этой сессии, и обратиться к ней можно только из этой сессии, в которой Вы ее создали. То есть, даже если Вы создаете такую таблицу в одном окне запроса Management Studio, то из другого окна, Вы к ней не сможете обратиться. Это упрощает разработку процедуры и в некоторых случаях сильно ее ускоряет (в качестве альтернативы можно использовать табличные переменные).

Надеюсь, эта статья поможет Вам разобраться, для чего нужны табличные функции и временные таблицы, и как Вы их можете использовать на практике.

Заметка! Для комплексного изучения языка SQL и T-SQL рекомендую посмотреть мои видеокурсы по T-SQL, которые помогут Вам «с нуля» научиться работать с SQL и программировать на T-SQL в Microsoft SQL Server.

Удачи!

Понравилась статья? Поделиться с друзьями:
Заметки IT специалиста
Комментарии: 1
  1. Вася Пупкин

    Можно ли использовать временные таблицы в табличных функциях

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!:
Нажимая на кнопку «Отправить комментарий», я даю согласие на обработку персональных данных и принимаю политику конфиденциальности.