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

Previous  Top  Next

    
 

 

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

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

Code:

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, которые представляют собой таблицу. Работа с такой переменной может выглядеть следующим образом:

Code:

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 более предпочтительно, чем использование временных таблиц, поскольку последние приводят к невозможности кэширования плана запроса (он генерируется при каждом выполнении), а в случае переменных этого не происходит.