2014-11-12 1 views
3

Мы знаем, что в SQL Server создание таблицы с # означает, что «local temp table» и ## означает «глобальная временная таблица».Таблица Temp с ### (тройным) или большим количеством хэшей

Но когда я создаю таблицу, как показано ниже:

create table ###MyTable(IntColumn int, ValueColumn varchar(100)) 

Является ли эта таблица локальной или глобальной временной таблицы? Как я могу проверить его? Когда я попытался select его помощью:

Select * from #MyTable -- SQL said it doesn't exists 
Select * from ##MyTable -- SQL said it doesn't exists 
Select * from ###MyTable -- I get the output 

Если третий случай, правда, не значит, что это общая таблица с именем ###MyTable? И разве я не увижу эту таблицу в моем проводнике таблиц SSMS, как все остальные физические таблицы?

Что произойдет, если я начну добавлять несколько # (хэшей) до имени моей таблицы?

ответ

3

Это global temp table. Он рассматривает третий # как часть имя_таблицы. Если вы проверите temdb database, вы увидите таблицу без идентификатора сеанса. Если временная таблица создается как локальная таблица темпа, то вы можете увидеть, что конкретный sessionID будет добавлен с соблазнительным именем, так как нет session ID, добавленного с именем temp tablename, это global temp table.

CREATE TABLE ###MyTable 
    (
    IntColumn INT, 
    ValueColumn VARCHAR(100) 
) 

После выполнения вышеупомянутого запроса

GOTO Сервер -> Базы данных -> Database System -> Tempdb -> Временные таблицы

вы можете найти созданный Global temptable так же, как на изображении ниже.

enter image description here

+0

так что ## хэши или более того, что внутри таблицы имя означает глобальные таблицы temp ??? –

+0

@Ganesh_Devlekar - да, и это должно быть в начале –

3

таблица с тройным хэшем просто обычная глобальная температурой таблица, где третий хэш стал частью имени таблицы, в отличие от делать ничего особенного.

-- global temp table name: #temp 
SELECT 1 AS value 
INTO ###temp 

-- global temp table name: temp 
SELECT 2 AS value 
INTO ##temp 

-- temp table name: temp 
SELECT 3 AS value 
INTO #temp 

select * from tempdb.INFORMATION_SCHEMA.TABLES 

Приведенный выше SQL при выполнении результатов показывает, что все объекты добавляются в temp db, как и следовало ожидать.

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

-- this one is accessible 
SELECT * 
FROM ###temp 

-- this one is accessible  
SELECT * 
FROM ##temp 

-- this one won't work as it's out of scope in a new query window 
SELECT * 
FROM #temp 

В общем, все, что после того, как второй хэш становится часть имени таблицы, и она будет сохранена в виде глобальной таблицы temp.

Смежные вопросы