複雑な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
はかなり小さいので、パフォーマンスは問題になりません。必要に応じて手動でのみ実行されます。
...または私がすべて間違ってやっているかどうかを教えてください。
このようなことを試してください:
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
の目的は、(ドキュメントによれば、私が強調していることです)
create 別のテーブルの値から新しいテーブルへ
しかし、あなたは既にhaveターゲットテーブルを持っています!だからあなたが欲しいのは
INSERT
ステートメントは、1つ以上の新しい行をテーブルに追加します以下の方法でデータ値を指定できます。
...
次のように、1つ以上の行のデータ値を指定するために
SELECT
サブクエリを使用します。INSERT INTO MyTable (PriKey, Description) SELECT ForeignKey, Description FROM SomeView
そしてthis構文では、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;
編集:多くのあなたが言及したように、接続からセッションへの更新された可視性。セッションは再利用できるため、一時テーブルを作成することはWebアプリケーションには適していません。その場合は一時変数を使用してください。
SELECT INTO
の代わりにINSERT
を使用してみてください。
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: 一時テーブルから値を選択してテーブル変数に挿入します。
insert into @tblOm_Variable select * from #tblom_temp
最後に値が一時テーブルからTable変数に挿入されます
ステップ5: テーブル変数の挿入値を確認できます。
select * from @tblOm_Variable
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;
ここでの主なことは挿入する列を選択することです。