6 ответов:
#tableотносится к локальной (видимой только пользователю, который ее создал) временной таблице.
##tableотносится к глобальной (видимой для всех пользователей) временной таблице.
@variableNameотносится к переменной, которая может содержать значения в зависимости от его типа.ура
#и##таблицы-это фактические таблицы, представленные во временной базе данных. Эти таблицы могут иметь индексы и статистику, и могут быть доступны через sprocs в сеансе (в случае глобальной временной таблицы, она доступна через сеансы).@table-это переменная таблицы.
Я бы сосредоточился на различиях между #table и @table. ##table-это глобальная временная таблица, и для записи за более чем 10 лет использования SQL Server мне еще не приходилось сталкиваться с допустимым вариантом использования. Я уверен, что некоторые существуют, но природа объекта делает его очень непригодным для использования ИМХО.
ответ на @whiner от @marc_s абсолютно верен: это распространенный миф, что табличные переменные всегда живут в памяти. Это на самом деле довольно часто для табличной переменной, чтобы перейти на диск и работать так же, как временная таблица.
в любом случае я предлагаю прочитать о множестве различий, следуя ссылкам, указанным @Astander. Большая часть разницы связана с ограничениями на то, что вы не можете сделать с переменными @table.
CREATE TABLE #tсоздает таблицу, которая видна только на этом соединении и во время него тот же пользователь, который создает другое соединение, не сможет увидеть таблицу #t из другого соединения.
CREATE TABLE ##tсоздает временную таблицу, видимую для других соединений. Но таблица удаляется при завершении создания соединения.
Если вам нужна уникальная глобальная временная таблица, создайте свою собственную с префиксом/суффиксом Uniqueidentifier и отбросьте выполнение post, если объект if object_id(.... Единственным недостатком является использование динамического sql и нужно явно отказаться.
Comments