web-dev-qa-db-ja.com

T-SQLでのテーブル変数のSELECT INTO

複雑な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

Table変数内のデータは、後で別のテーブルに挿入/更新するために使用されます(主に、マイナーな更新で同じデータのコピー)。これの目的は、単にSELECT INTOを正しいテーブルに直接入れるよりも、スクリプトをもう少し読みやすくカスタマイズしやすくすることです。 rowcountはかなり小さいので、パフォーマンスは問題になりません。必要に応じて手動でのみ実行されます。
...または私がすべて間違ってやっているかどうかを教えてください。

335
Indrek

このようなことを試してください:

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;
539
CristiC

SELECT INTOの目的は、(ドキュメントによれば、私が強調していることです)

create 別のテーブルの値から新しいテーブルへ

しかし、あなたは既にhaveターゲットテーブルを持っています!だからあなたが欲しいのは

INSERTステートメントは、1つ以上の新しい行をテーブルに追加します

以下の方法でデータ値を指定できます。

...

次のように、1つ以上の行のデータ値を指定するためにSELECTサブクエリを使用します。

  INSERT INTO MyTable 
 (PriKey, Description)
        SELECT ForeignKey, Description
        FROM SomeView

そしてthis構文では、MyTableをテーブル変数にすることができます。

90
AakashM

共通のテーブル式を使用して一時データセットを格納することもできます。よりエレガントでアドホックなものです。

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
23
nanestev

アプリケーションから一時テーブルを使用していない場合は、一時テーブルを使用してみてください。 (これを手動で実行してもかまいません)

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;

編集:多くのあなたが言及したように、接続からセッションへの更新された可視性。セッションは再利用できるため、一時テーブルを作成することはWebアプリケーションには適していません。その場合は一時変数を使用してください。

15
Mulki

SELECT INTOの代わりにINSERTを使用してみてください。

INSERT @UserData   
SELECT name, location etc.
8
Noel Abrahams

まず一時テーブルを作成します。

ステップ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: 一時テーブルから値を選択してテーブル変数に挿入します。

insert into @tblOm_Variable select * from #tblom_temp

最後に値が一時テーブルからTable変数に挿入されます

ステップ5: テーブル変数の挿入値を確認できます。

select * from @tblOm_Variable
5
404 Not found

OK、今十分な努力を払って、私は以下を使って@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 '、
ERRORFILE = N'C:\ Temp\MovieLensRatings.txt ')AS a;

ここでの主なことは挿入する列を選択することです。

1
RahulJha