ВЫБРАТЬ В табличную переменную в T-SQL - PullRequest
341 голосов
/ 01 октября 2010

Получил сложный запрос 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 ]

551 голосов
/ 01 октября 2010

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

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;
90 голосов
/ 01 октября 2010

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

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

Но у вас уже есть целевая таблица !Так что вам нужно:

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

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

...

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

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

И в this синтаксис, MyTable может быть табличной переменной.

24 голосов
/ 05 февраля 2016

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

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
15 голосов
/ 01 октября 2010

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

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

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

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

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;

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

8 голосов
/ 01 октября 2010

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

INSERT @UserData   
SELECT name, location etc.
5 голосов
/ 20 марта 2014

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

Шаг 1:

create table #tblOm_Temp (

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

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

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
1 голос
/ 22 сентября 2017

ОК, теперь с достаточным усилием я могу вставить в @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 ',
ERRORFILE = N'C: \ Temp \ MovieLensRatings.txt') как;

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

0 голосов
/ 23 августа 2013

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

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

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

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