Переменная таблицы T-SQL Создание физической таблицы! - PullRequest
4 голосов
/ 10 марта 2010

OMG! Что я делаю не так?

declare @WTF TABLE (
 OrderItemId int
)

SELECT TOP 20 OrderItemId as OrderItemId INTO [@WTF] FROM ac_OrderItems

SELECT * FROM [@WTF]

Проблема A : При этом создается ФИЗИЧЕСКАЯ таблица с именем @WTF. ЗАЧЕМ?? Я думал, что это было только в памяти?!

Проблема B : Последняя строка кода, если я выберу * из @WTF ... БЕЗ [], ничего не возвращает. Какое значение имеет []?

Мне нужна серьезная помощь. Я теряю УМ!

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 10 марта 2010

Что вы испытываете, это дизайн :

SELECT… INTO создает новую таблицу в файловой группе по умолчанию и вставляет в нее результирующие строки из запроса.

Альтернативы:

  1. Не определять таблицу WTF, а полагаться на поведение для ее автоматического создания
  2. Используйте существующий код, но измените SELECT INTO на ВСТАВКУ:

    INSERT INTO @WTF
      (orderitemid)
    SELECT TOP 20 
           oi.orderitemid
      FROM ac_ORDERITEMS oi
    

Помните, что при использовании TOP вы должны определить условие ORDER BY, чтобы обеспечить последовательный возврат данных.

4 голосов
/ 10 марта 2010

Потому что Select INTO всегда создает физическую таблицу. То, что вы хотите сделать, это вставить в.

Select INTO создает физическую таблицу с именем '@WTF', как и положено.

2 голосов
/ 11 марта 2010

Вторичный ответ заключается в том, что причина, по которой он работает только с квадратными скобками [], заключается в знаке @.

select * from  @WTF

выбирает из вашей пустой переменной таблицы, где

select * from  [@WTF]

- это выбор из новой физической таблицы, выбранной для создания, которая была заполнена данными. Скобки используются, чтобы разрешить символы, которые обычно не разрешены в имени таблицы или столбца, поэтому их использование здесь означает, что вы ищете таблицу с именем @WTF вместо переменной с именем WTF.

0 голосов
/ 26 декабря 2011

Все табличные переменные являются "физическими" таблицами.

Ваша вера в то, что они "только память" - это миф. Они находятся в tempdb и отображаются в представлениях метаданных с именами, созданными системой, такими как #4BAC3F29 Структура табличной переменной идентична таблице #temp.

Нельзя использовать SELECT ... INTO с табличными переменными, но можно использовать с #temp таблицами. Ваш код просто создает новую пользовательскую таблицу с именем @WTF в вашей базе данных пользователей, как указано в других ответах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...