9

我正在尝试在下面执行此代码。这是我必须编写的实际代码的简化示例,所以我知道以这种方式循环是没有用的。但是,我需要在 SQL Server 中查看和联合选择语句。当我尝试运行此查询时,出现错误:

关键字“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,您需要从第二个表中进行选择。

SQL Server 本质上看到:

SELECT * FROM mytable      

UNION ALL 

之后没有第二张桌子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。while 循环不会保留选定的集合并在下一次知道它。您要完成的基本上是从 mytable 中选择所有数据,然后在同一组中再次将其合并... n 次。这真的没有意义。请记住,SQL 是基于设置的,因此 select * From mytable 将选择其中的每条记录。您也从不说明您要完成的工作。

于 2012-10-12T17:58:16.717 回答