Область производных таблиц в SQL Server - PullRequest
1 голос
/ 12 мая 2010

Я недавно изучал SQL и немного изучал его.Что касается временных таблиц, я обнаружил 3 различных типа временных таблиц:

1) CREATE TABLE # TempTable

2) ОБЪЯВИТЬ СТОЛ @ TempTable

3) SELECT * FROM (SELECT * FROM Customers) AS TempTable

Теперь я понимаю область действия типов #TempTable и @TempTable, но как насчет производной таблицы, как в примере 3?Где хранится эта производная таблица?и если она объявлена ​​в 1 транзакции, может ли вторая транзакция получить к ней доступ, или область видимости производных таблиц совпадает с примером 1 и 2?

Ответы [ 2 ]

6 голосов
/ 12 мая 2010

1) CREATE TABLE #TempTable - локальная временная таблица

Локальные временные таблицы видны только в текущем сеансе и могут быть разделены между вложенными вызовами хранимых процедур: http://www.sommarskog.se/share_data.html#temptables

2) DECLARE TABLE @TempTable - локальная переменная таблицы

Область действия локальной переменной - это пакет, хранимая процедура или блок операторов, в котором она объявлена. Они могут быть переданы как параметры между процедурами. Они не подлежат транзакциям и сохранят все строки после отката.

3) ВЫБРАТЬ * ИЗ (ВЫБРАТЬ * ИЗ ПОКУПАТЕЛЕЙ) КАК TempTable - полученная таблица

виден только текущему запросу

4) CREATE TABLE ## TempTable - глобальная временная таблица

Это отличается от таблицы #temp тем, что она видна всем процессам. Когда процесс создания заканчивается, таблица удаляется (но будет ждать, пока не будет выполнена какая-либо текущая активность других процессов).

5) CTE - общее табличное выражение

пример CTE:

;WITH YourBigCTE AS
(
    big query here

)
SELECT * FROM YourTable1  WHERE ID IN (SELECT ID FROM YourBigCTE)
UNION 
SELECT * FROM YourTable2  WHERE ID IN (SELECT ID FROM YourBigCTE)

может использоваться несколько раз в одной и той же команде CTE, даже рекурсивно, и будет действовать в течение всей команды CTE.

1 голос
/ 12 мая 2010

Это зависит от фактической СУБД, которую вы используете - я предполагаю, Sybase или SQL Server (но вполне может быть верно для всех)

SELECT * FROM (SELECT * FROM Customers) AS TempTable

Temptable доступен только для текущего оператора SQL, т.е. только для выбора.

SELECT * FROM Customers into tempdb..TempTable

создаст новую таблицу в базе данных tempdb, которая должна быть явно удалена

...