ВЫБРАТЬ В табличную переменную в 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
Это не будет работать с табличной переменной, что очень плохо...