9

以下のコードを実行しようとしています。これは私が実際に作成しなければならないコードの単純化された例なので、そのような方法でループしても無駄であることはわかっています。ただし、SQL Server で select ステートメントを調べて結合する必要があります。このクエリを実行しようとすると、エラーが発生します。

キーワード 'END' 付近の構文が正しくありません。

何か案は?

  DECLARE @position INT
    SET @position = -1

    WHILE(@position < 1)
    BEGIN
    SELECT * FROM mytable

    UNION ALL
    END
 SELECT * FROM mytable
4

4 に答える 4

16

使用しようとする代わりにUNION、一時テーブルまたは一時テーブル変数を使用して結果セットをマージします

CREATE TABLE #Temp
(
  <COLUMNS>
)

 DECLARE @position INT
 SET @position = -1

 WHILE(@position < 1)
 BEGIN

    INSERT INTO #Temp (<COLUMNS>)
    SELECT * FROM mytable

    SET @position = @position + 1

 END

 SELECT * FROM #Temp
于 2012-10-12T17:59:43.483 に答える
5

そのクエリは意味がありません。を使用するUNIONには、2 番目のテーブルから選択する必要があります。

SQL Server は基本的に次のことを認識します。

SELECT * FROM mytable      

UNION ALL 

の後に 2 番目のテーブルはありませんUNION

于 2012-10-12T17:55:51.290 に答える
1

この方法では、UNION ステートメントを取り除き、ループを完全に回避します。

DECLARE @position INT
SET @position = 5

DECLARE @n TABLE (n int)

INSERT INTO @n 
SELECT ROW_NUMBER() OVER (ORDER BY name) AS x
FROM syscolumns

SELECT t.* 
FROM dbo.Table t
    CROSS JOIN @n n 
WHERE n <= @position    
于 2012-10-12T18:04:47.513 に答える
0

UNION をオンにする 2 つ目のセットが必要です。while ループは、選択されたセットを保持せず、次回からそれを認識します。あなたが達成しようとしているのは、基本的に mytable からすべてのデータを選択し、同じセットで再度結合することです... n回。これは本当に意味がありません。SQL はセットベースであるため、select * From mytable はそこにあるすべてのレコードを選択することに注意してください。また、達成しようとしていることを決して述べません。

于 2012-10-12T17:58:16.717 に答える