ВЫБРАТЬ В табличную переменную в 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

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

8 ответов

Решение

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

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;

Цель SELECT INTO есть (согласно документации, мой акцент)

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

Но у вас уже есть целевой стол! Итак, что вы хотите, это

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

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

...

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

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

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

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

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

Вы можете попробовать использовать временные таблицы... если вы не делаете это из приложения. (Это может быть нормально, чтобы запустить это вручную)

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;

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

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

INSERT @UserData   
SELECT name, location etc.

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

Шаг 1:

create table #tblOm_Temp (

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

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

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

Шаг 3: Объявите переменную таблицы для хранения данных временной таблицы.

declare   @tblOm_Variable table(

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

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

insert into @tblOm_Variable select * from #tblom_temp

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

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

select * from @tblOm_Variable

Хорошо, теперь с достаточным усилием я могу вставить в @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;

Здесь главное выбрать столбцы для вставки.

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

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

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

Другие вопросы по тегам