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
Это не будет работать с табличной переменной, что слишком плохо...