413

複雑なSELECTクエリを取得しました。このクエリから、すべての行をテーブル変数に挿入したいのですが、T-SQLでは許可されていません。

同じように、SELECTINTOまたはINSERTEXECクエリでテーブル変数を使用することはできません。 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はかなり小さく、必要な場合にのみ手動で実行されるため、パフォーマンスは問題になりません。
...または私がそれをすべて間違っているかどうか教えてください。

4

8 に答える 8

654

次のようなものを試してください。

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;
于 2010-10-01T10:22:02.850 に答える
100

の目的SELECT INTOは(ドキュメントによると、私の強調)です

別のテーブルの値から新しいテーブルを作成するには

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

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

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

..。

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

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

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

于 2010-10-01T10:28:52.117 に答える
33

一般的なテーブル式を使用して、一時データセットを格納することもできます。彼らはよりエレガントでアドホックフレンドリーです:

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
于 2016-02-04T21:38:23.277 に答える
16

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

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アプリケーションのオプションではありません。そのような場合は、一時変数に固執します。

于 2010-10-01T10:21:15.003 に答える
9

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

   DECLARE @UserData TABLE(
                        name varchar(30) NOT NULL,
                        oldlocation varchar(30) NOT NULL
                       )

    INSERT @UserData   
    SELECT name, oldlocation
于 2010-10-01T10:19:31.157 に答える
7

最初に一時テーブルを作成します。

ステップ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

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

手順5:テーブル変数に挿入された値を確認できます。

select * from @tblOm_Variable
于 2014-03-20T09:02:49.827 に答える
1

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;

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

于 2017-09-22T09:29:53.333 に答える
-5

SELECT INTOを使用する理由の1つは、IDENTITYを使用できることです。

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

これはテーブル変数では機能しませんが、これは残念です...

于 2013-08-23T00:02:43.700 に答える