Выберите в табличной переменной в 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есть (в документах, мой акцент)до создать новая таблица из значений в другой таблице
но ты уже есть целевую таблицу! Так что вы хотите
The
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;
сначала создайте временную таблицу:
Шаг 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: выберите значение из таблицы temp и вставьте в переменную таблицы.
insert into @tblOm_Variable select * from #tblom_tempнаконец значение вставляется из временной таблицы в переменную таблицы
Шаг 5: Можно проверить вставленное значение в переменной таблицы.
select * from @tblOm_Variable
хорошо, Теперь с достаточным усилием я могу вставить в @table, используя следующее:
вставить @TempWithheldTable SELECT
а.SuspendedReason, а.SuspendedNotes, а.SuspendedBy , A. ReasonCode из OPENROWSET (BULK 'C:\DataBases\WithHeld.КШМ', ФОРМАТНАЗВАНИЕ = N'C:\DataBases\Format.txt',
ERRORFILE=N'C:\Temp\MovieLensRatings.txt' ) В качестве;главное здесь-это выбор столбцов для вставки .