Таблицы SQL Server: в чем разница между @, # и ##?


Ответы:


115

#table относится к локальной (видимой только пользователю, создавшему ее) временной таблице.

##table относится к глобальной (видимой всем пользователям) временной таблице.

@variableName относится к переменной, которая может содержать значения в зависимости от ее типа.


32
Ваше определение #table не совсем верно. Это не ограничивается пользователем, а скорее подключением. Если у пользователя несколько подключений, он будет виден только тому подключению, которое изначально создало #table.
Davin Studer

@DavinStuder дал важное разъяснение. Различие между таблицей, видимой пользователю, и таблицей, видимой только в текущем соединении, очень важно.
mirzmaster

@DavinStuder, как просмотреть несколько подключений для пользователя? та же строка подключения?
Kiquenet

24

4
Я понимаю, что это было давно, но поскольку это ответ только для ссылок (а первая ссылка мертва), можно ли его обновить с помощью основных выводов по каждой из ссылок?
Майк Гатри,

7

#а ##таблицы - это фактические таблицы, представленные во временной базе данных. Эти таблицы могут иметь индексы и статистику, и к ним можно получить доступ через sprocs в сеансе (в случае глобальной временной таблицы он доступен через сеансы).

@Table - это табличная переменная.

Подробнее: http://www.sqlteam.com/article/ Contemporary-tables


4
И табличная переменная также будет жить в базе данных tempDB, если ее размер слишком велик для хранения в памяти.
marc_s

5

Я бы остановился на различиях между #table и @table. ## table - это глобальная временная таблица, и за более чем 10 лет использования SQL Server мне еще предстоит найти допустимый вариант использования. Я уверен, что некоторые из них существуют, но природа объекта делает его крайне непригодным для использования ИМХО.

Ответ на @whiner со стороны @marc_s абсолютно верен: это распространенный миф, что переменные таблицы всегда находятся в памяти. На самом деле довольно часто табличная переменная отправляется на диск и работает так же, как временная таблица.

В любом случае, я предлагаю ознакомиться с множеством различий, пройдя по ссылкам, указанным @Astander. Большая часть различий связана с ограничениями того, что нельзя делать с переменными @table.


У меня есть 5 отдельных хранимых процедур, которые выполняют разные части расчета и выводят один результат. Что касается одитинга, я хочу видеть промежуточные значения, и одитор тоже. Я скорректировал свои процедуры, чтобы выгружать некоторые из них в таблицу ## Temp, чтобы мы оба могли их просматривать, но они не сохранялись (они нужны только во время аудита). Для вас есть допустимый вариант использования (ИМХО!).
RyanfaeScotland

@Ryan, почему ## Table действительна, если вы могли использовать dbo.Table? Я не считаю это допустимым вариантом использования, когда все, что вы сделали, это избавило себя от ввода оператора DROP.
Аарон Бертран,

4
Я не хочу давать аудитору права DROP для моей БД. Я также не хочу возвращаться и наводить порядок после того, как он закончит. С помощью временной таблицы он может запускать запрос так часто, как ему нравится, и я знаю, что когда он закончил, он не оставляет следов в БД.
RyanfaeScotland

4
CREATE TABLE #t

Создает таблицу, которая видна только во время этого СОЕДИНЕНИЯ, и тот же пользователь, который создает другое подключение, не сможет видеть таблицу #t из другого подключения.

CREATE TABLE ##t

Создает временную таблицу, видимую для других подключений. Но таблица удаляется, когда создание соединения завершается.


SqlConnection.Open()с той же строкой подключения такое же СОЕДИНЕНИЕ ?
Kiquenet

2
нет, это соединение с той же базой данных, но почти наверняка не то же соединение.
Маркус

0

если вам нужна уникальная глобальная временная таблица, создайте свою собственную с префиксом / суффиксом Uniqueidentifier и отмените выполнение публикации, если if object_id (.... Единственным недостатком является использование Dynamic sql, и его необходимо явно удалить.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.