Выберите в табличной переменной в 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' ) В качестве;главное здесь-это выбор столбцов для вставки .