SELECT В переменной таблицы в T-SQL

Получил сложный запрос SELECT, из которого я хотел бы вставить все строки в переменную таблицы, но T-SQL не разрешает его.

В тех же строках вы не можете использовать переменную таблицы с запросами SELECT INTO или INSERT EXEC. http://odetocode.com/Articles/365.aspx

Краткий пример:

declare @userData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

SELECT name, location
INTO @userData
FROM myTable
    INNER JOIN otherTable ON ...
WHERE age > 30

Данные в переменной таблицы позже будут использоваться для вставки/обновления в разные таблицы (в основном копирование одних и тех же данных с незначительными обновлениями). Целью этого было бы просто сделать script более читаемым и более легко настраиваемым, чем сделать SELECT INTO прямо в правые таблицы. Производительность не является проблемой, так как rowcount довольно мал и он запускается только вручную, когда это необходимо.
... или просто скажите мне, не делаю ли я все это неправильно.

Ответ 1

Попробуйте что-то вроде этого:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData (name, oldlocation)
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

Ответ 2

Цель SELECT INTO - (для каждого документа, моего акцента)

Чтобы создать новую таблицу из значений в другой таблице

Но у вас уже есть целевая таблица! Итак, вы хотите

Оператор INSERT добавляет одну или несколько новых строк в таблицу

Вы можете указать значения данных в следующими способами:

...

Используя подзапрос SELECT для указания значения данных для одной или нескольких строк, например:

  INSERT INTO MyTable 
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

И в этом синтаксисе он разрешил MyTable быть табличной переменной.

Ответ 3

Вы также можете использовать общие выражения таблиц для хранения временных наборов данных. Они более элегантные и дружелюбные:

WITH userData (name, oldlocation)
AS
(
  SELECT name, location 
  FROM   myTable    INNER JOIN 
         otherTable ON ...
  WHERE  age>30
)
SELECT * 
FROM   userData -- you can also reuse the recordset in subqueries and joins

Ответ 4

Вы можете попробовать использовать временные таблицы...

SELECT name, location INTO #userData FROM myTable
INNER JOIN otherTable ON ...
WHERE age>30

Вы пропускаете попытку объявить таблицу таким образом... Помогает для специальных запросов... Это создает локальную временную таблицу, которая не будет видна другим сеансам, если вы не используете один и тот же сеанс в своем приложении. (Не рекомендуется)

если вам требуются переменные, они могут быть объявлены следующим образом:

DECLARE @userData TABLE(
    name varchar(30) NOT NULL,
    oldlocation varchar(30) NOT NULL
);

INSERT INTO @userData
SELECT name, location FROM myTable
INNER JOIN otherTable ON ...
WHERE age > 30;

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

Ответ 5

Попробуйте использовать INSERT вместо SELECT INTO:

INSERT @UserData   
SELECT name, location etc.

Ответ 6

Сначала создайте временную таблицу:

Шаг 1:

create table #tblOm_Temp (

    Name varchar(100),
    Age Int ,
    RollNumber bigint
)

** Шаг 2: ** Вставьте некоторое значение в таблицу Temp.

insert into #tblom_temp values('Om Pandey',102,1347)

Шаг 3: Объявить таблицу Переменная для хранения данных таблицы temp.

declare   @tblOm_Variable table(

    Name Varchar(100),
    Age int,
    RollNumber bigint
)

Шаг 4: выберите значение из таблицы temp и вставьте в переменную таблицы.

insert into @tblOm_Variable select * from #tblom_temp

Наконец, значение вставляется из таблицы temp в переменную Table

Шаг 5: Можно проверить вставленное значение в переменной таблицы.

select * from @tblOm_Variable

Ответ 7

ОК, теперь с достаточным усилием я могу вставить в @table, используя ниже:

INSERT @TempWithheldTable SELECT
                              a.SuspendedReason,                               a.SuspendedNotes,                               a.SuspendedBy,                               a.ReasonCode FROM OPENROWSET (BULK 'C:\DataBases\WithHeld.csv', FORMATFILE = N'C:\Databases\Format.txt ",
= N'C файл ошибок:\Temp\MovieLensRatings.txt"          ) AS a;

Главное здесь - выбрать столбцы для вставки.

Ответ 8

Одна из причин использования SELECT INTO заключается в том, что она позволяет вам использовать IDENTITY:

SELECT IDENTITY(INT,1,1) AS Id, name
INTO #MyTable 
FROM (SELECT name FROM AnotherTable) AS t

Это не будет работать с табличной переменной, что слишком плохо...