Выберите в табличной переменной в 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 297

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;

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

INSERT @UserData   
SELECT name, location etc.

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

Шаг 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' ) В качестве;

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

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

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

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