Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Временные таблицы

01.01.2007

Для промежуточной обработки данных клиентское приложение может создавать временные таблицы. Временной является таблица, имя которой начинается с # или ##. Таблица, имя которой начинается с # является локальной и видима только той сессии, в которой она была создана. После завершения сеанса временные таблицы, созданные им автоматически удаляются. Если временная таблица создана внутри хранимой процедуры, она автоматически удаляется по завершению процедуры. Если имя таблицы начинается с ##, то она является глобальной и видима всеми сессиями. Таблица удаляется автоматически, когда завершается последняя из использовавших её сессий.

Для примера рассмотрим хранимую процедуру, которая выдает значения продаж по месяцам. Если в данном месяце продаж не было, выводится имя месяца и NULL.

CREATE PROCEDURE AmountsByMonths
AS
BEGIN
 DECLARE @I INTEGER
 CREATE TABLE
#Months (
   
Id INTEGER,
   
Name CHAR(20)
 
)
 SET @I
= 1
 WHILE
(@I <= 12) BEGIN
   INSERT
Months (Id, Name) VALUES
     
(@I, DATENAME(month, '1998' + REPLACE(STR(@I,2),' ','0')+'01'))
   SET @I
= @I + 1
 
END
 SELECT M
.Name, SUM(P.Amount)
   FROM
#Months M INNER JOIN Payment P
    ON M
.Id = DATEPART(month, P.Date)
 DROP TABLE
#Months
END

В версии MSSQL 2000 появилась возможность создавать переменные типа table, которые представляют собой таблицу. Работа с такой переменной может выглядеть следующим образом:

DECLARE @T TABLE (Id INT)

INSERT @T
(Id) VALUES (10250)
INSERT @T
(Id) VALUES (10257)
INSERT @T
(Id) VALUES (10259)

SELECT O
.*
  FROM
Orders O
   INNER JOIN @T AS T ON O
.OrderId = T.Id

Использование переменных типа table более предпочтительно, чем использование временных таблиц, поскольку последние приводят к невозможности кэширования плана запроса (он генерируется при каждом выполнении), а в случае переменных этого не происходит.