В чем разница между таблицей @, таблицей # и таблицей ## в SQL Server?
В чем разница между таблицей @, таблицей # и таблицей ## в SQL Server?
Ответы:
#table
относится к локальной (видимой только пользователю, создавшему ее) временной таблице.
##table
относится к глобальной (видимой всем пользователям) временной таблице.
@variableName
относится к переменной, которая может содержать значения в зависимости от ее типа.
#
а ##
таблицы - это фактические таблицы, представленные во временной базе данных. Эти таблицы могут иметь индексы и статистику, и к ним можно получить доступ через sprocs в сеансе (в случае глобальной временной таблицы он доступен через сеансы).
@Table - это табличная переменная.
Подробнее: http://www.sqlteam.com/article/ Contemporary-tables
Я бы остановился на различиях между #table и @table. ## table - это глобальная временная таблица, и за более чем 10 лет использования SQL Server мне еще предстоит найти допустимый вариант использования. Я уверен, что некоторые из них существуют, но природа объекта делает его крайне непригодным для использования ИМХО.
Ответ на @whiner со стороны @marc_s абсолютно верен: это распространенный миф, что переменные таблицы всегда находятся в памяти. На самом деле довольно часто табличная переменная отправляется на диск и работает так же, как временная таблица.
В любом случае, я предлагаю ознакомиться с множеством различий, пройдя по ссылкам, указанным @Astander. Большая часть различий связана с ограничениями того, что нельзя делать с переменными @table.
CREATE TABLE #t
Создает таблицу, которая видна только во время этого СОЕДИНЕНИЯ, и тот же пользователь, который создает другое подключение, не сможет видеть таблицу #t из другого подключения.
CREATE TABLE ##t
Создает временную таблицу, видимую для других подключений. Но таблица удаляется, когда создание соединения завершается.
SqlConnection.Open()
с той же строкой подключения такое же СОЕДИНЕНИЕ ?