Таблиці SQL Server: у чому різниця між @, # та ##?


Відповіді:


114

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

##table відноситься до глобальної (видимої всім користувачам) тимчасової таблиці.

@variableName відноситься до змінної, яка може містити значення залежно від її типу.


31
Ваше визначення #table не зовсім правильне. Це не обмежується користувачем, а швидше підключенням. Якщо користувач має кілька з'єднань, це буде видно лише тому з'єднанню, яке створило #table.
Davin Studer

@DavinStuder запропонував вирішальне роз'яснення. Різниця між таблицею, видимою для користувача, та таблицею, видимою лише під час поточного з'єднання, є дуже важливою.
mirzmaster

@DavinStuder як переглядати кілька підключень для користувача? той самий рядок з'єднання?
Кікенет,

24

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

7

#а ##таблиці - це фактичні таблиці, представлені в базі даних temp. Ці таблиці можуть мати індекси та статистичні дані, а також доступ до них через послідовності в сеансі (у випадку глобальної тимчасової таблиці вона доступна для всіх сесій).

@Table є змінною таблиці.

Докладніше: http://www.sqlteam.com/article/temporary-tables


4
І змінна таблиці також буде жити в базі даних tempDB, якщо її розмір занадто великий для зберігання в пам'яті.
marc_s

5

Я б зупинився на відмінностях між #table та @table. ## table - це глобальна тимчасова таблиця, і для запису за 10 років використання SQL Server я ще не стикався з дійсним випадком використання. Я впевнений, що деякі існують, але природа об'єкта робить його вкрай непридатним для використання IMHO.

Відповідь @marc_s на @whiner є абсолютно правдивою: це поширений міф про те, що змінні таблиці завжди живуть у пам'яті. Насправді досить часто, коли змінна таблиці переходить на диск і працює так само, як тимчасова таблиця.

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


У мене є 5 окремих збережених процедур, які виконують різні частини обчислення і виводять один результат. Для аудиту я хочу бачити проміжні значення, а також аудитор. Я скоригував свої процедури, щоб скидати деякі в таблицю ## Temp, щоб ми могли обидва їх переглядати, але вони не зберігаються (вони потрібні лише під час аудитів). Для вас існує дійсний варіант використання (IMHO!).
RyanfaeScotland

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

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

4
CREATE TABLE #t

Створює таблицю, яка відображається лише на ПІДКЛЮЧЕННІ, і під час ПІДКЛЮЧЕННЯ той самий користувач, який створює інше підключення, не зможе побачити таблицю #t з іншого підключення.

CREATE TABLE ##t

Створює тимчасову таблицю, видиму для інших з'єднань. Але таблиця скидається, коли створення з'єднання закінчується.


SqlConnection.Open()з тим самим рядком з'єднання - це те саме З'ЄДНАННЯ ?
Кікенет,

2
ні, це підключення до тієї самої бази даних, але майже напевно не одне і те ж підключення.
Маркус

0

якщо вам потрібна унікальна глобальна тимчасова таблиця, створіть свою власну за допомогою префіксу / суфікса Uniqueidentifier та відкиньте виконання після if if_id_id (.... Єдиним недоліком є ​​використання Dynamic sql і його потрібно явно скинути.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.