В SQL Server временните таблици се създават с помощта на същия CREATE TABLE
синтаксис като обикновени таблици. Разликата е, че имената на временните таблици са с префикс с един или два знака за числа (#
), в зависимост от това дали е локална временна таблица или глобална временна таблица:
- Локални временни таблици са с префикс с едно число (
#
) - Глобални временни таблици са с префикс с двоен знак за число (
##
)
Пример 1 – Създайте локална временна таблица
Ето пример за създаване на локална временна таблица:
CREATE TABLE #Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Името, което посочвате за локална временна таблица, може да бъде максимум 116 знака. Други типове таблици могат да бъдат 128 знака, но локалните временни таблици автоматично се добавят с генериран от системата цифров суфикс.
Пример 2 – Създайте глобална временна таблица
Ето пример за създаване на глобална временна таблица:
CREATE TABLE ##Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Глобалните имена на временни таблици могат да бъдат максимум 128 знака. SQL Server не добавя генериран от системата цифров суфикс към глобалните временни таблици, както прави за локалните временни таблици, така че можете да използвате цялото пространство.
Пример 3 – Преглед на временните таблици
Мога да изпълня следната заявка, за да видя новосъздадените си временни таблици.
SELECT name FROM tempdb.sys.tables WHERE name LIKE '#Cats%' OR name = '##Cats';
Резултат:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | +----------------------------------------------------------------------------------------------------------------------------------+
Можем да видим, че към локалната временна таблица е добавен генерираният от системата числов суфикс и ето защо моята заявка използва LIKE
оператор за тази таблица.
Пример 4 – Нова сесия
Ако отворя нова сесия, създам локална временна таблица със същото име (Cats), след което стартирам тази заявка отново, получавам това:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | +----------------------------------------------------------------------------------------------------------------------------------+
Така че множество сесии могат да създадат локална таблица със същото име, тъй като SQL Server променя това име, като увеличава наставката.
Пример 5 – Същата сесия
Въпреки това, ако се опитам да създам локалната временна таблица отново в същата сесия, получавам това:
Msg 2714, Level 16, State 6, Line 1 There is already an object named '#Cats' in the database.
И ако отворя още една сесия, съм успешен и когато задам tempdb.sys.tables
Разбрах това:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | | #Cats_______________________________________________________________________________________________________________00000000001B | +----------------------------------------------------------------------------------------------------------------------------------+