У чому полягає різниця між таблицею @, таблицею # і таблицею ## у SQL Server?
У чому полягає різниця між таблицею @, таблицею # і таблицею ## у SQL Server?
Відповіді:
#table
посилається на локальну (видиму лише користувачеві, який її створив) тимчасову таблицю.
##table
відноситься до глобальної (видимої всім користувачам) тимчасової таблиці.
@variableName
відноситься до змінної, яка може містити значення залежно від її типу.
#
а ##
таблиці - це фактичні таблиці, представлені в базі даних temp. Ці таблиці можуть мати індекси та статистичні дані, а також доступ до них через послідовності в сеансі (у випадку глобальної тимчасової таблиці вона доступна для всіх сесій).
@Table є змінною таблиці.
Докладніше: http://www.sqlteam.com/article/temporary-tables
Я б зупинився на відмінностях між #table та @table. ## table - це глобальна тимчасова таблиця, і для запису за 10 років використання SQL Server я ще не стикався з дійсним випадком використання. Я впевнений, що деякі існують, але природа об'єкта робить його вкрай непридатним для використання IMHO.
Відповідь @marc_s на @whiner є абсолютно правдивою: це поширений міф про те, що змінні таблиці завжди живуть у пам'яті. Насправді досить часто, коли змінна таблиці переходить на диск і працює так само, як тимчасова таблиця.
У будь-якому випадку я пропоную ознайомитися з набором відмінностей, перейшовши за посиланнями, вказаними @Astander. Більшість різниць пов'язані з обмеженнями того, чого не можна робити зі змінними @table.
CREATE TABLE #t
Створює таблицю, яка відображається лише на ПІДКЛЮЧЕННІ, і під час ПІДКЛЮЧЕННЯ той самий користувач, який створює інше підключення, не зможе побачити таблицю #t з іншого підключення.
CREATE TABLE ##t
Створює тимчасову таблицю, видиму для інших з'єднань. Але таблиця скидається, коли створення з'єднання закінчується.
SqlConnection.Open()
з тим самим рядком з'єднання - це те саме З'ЄДНАННЯ ?