2

while ループで選択式を使用する必要があり、以下のサンプル コードを使用します。

 declare @i integer
 set @i=1
 while (@i<10)
 begin
   select @i as m;
   set @i=@i+1
 END 

このコードは 10 個の個別のテーブルを返します! すべての選択結果を 1 つのテーブルに返したいのですが、それは可能ですか? はいの場合...どのように?

4

4 に答える 4

5

これには、一時テーブルまたはテーブル変数を使用できます。

一時テーブルを使用してそれを行う方法は次のとおりです。

CREATE TABLE #t (m INT)
DECLARE @i INT
SET @i=1
WHILE (@i<10)
BEGIN
  INSERT INTO #t SELECT @i
  SET @i=@i+1
END 
SELECT m FROM #t

テーブル変数と非常によく似ています

DECLARE @t TABLE (m INT)
DECLARE @i INT
SET @i=1
WHILE (@i<10)
BEGIN
  INSERT INTO @t SELECT @i
  SET @i=@i+1
END 
SELECT m FROM @t
于 2013-01-30T13:19:09.413 に答える
4

それは不可能。各SELECTステートメントは、独自の結果セットを生成します。一時テーブルを使用して、各反復の結果を追加し、すべてを 1 つのテーブルに取得できます。整数のシーケンスを生成するには、これを使用できます (SQL SERVER 2005 + の場合)

;WITH CTE
AS
(
   SELECT 1 N
   UNION ALL
   SELECT N + 1 FROM CTE
   WHERE N<10
)
SELECT N FROM CTE
于 2013-01-30T13:18:55.057 に答える
2

squillman はそれを取得しました... #t (テーブルを作成します # - セッションが開いている間、トップレベルのスコープで保持されるテーブル - いくつかのバッチ ステートメントがある場合は、テーブルを削除するまで宣言後にこのテーブルを参照できます)

Cris も @test で取得しました (@ テーブルを宣言 - 変数 - 現在のスコープでのみ永続化 - 単一の実行バッチ ブロック...これを使用すると、いくつかのパフォーマンスの問題が発生する可能性があることに注意してください)

使用できる最後のタイプの一時テーブルはグローバル一時テーブルです (テーブルを作成します ## - それを作成したセッションが開いている限り、または削除されるまで続きます)

#t を使用して、セッションを閉じない場合は、これをスクリプトの先頭に追加することをお勧めします。

IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t

一時テーブルをお楽しみください。

于 2013-01-30T13:33:26.803 に答える
1
declare @i integer
DECLARE @test TABLE(
  m /*your data type*/
)
 set @i=1
 while (@i<10)
 begin
   insert into @test select @i;

   set @i=@i+1
 END 

select * from @test
于 2013-01-30T13:21:53.913 に答える