0

我正在运行 SQL Server 2008。我需要查询具有增量名称的表。这些表的结构完全相同,我需要从所有(~50)表中提取数据。表的命名约定如下:Break1、Break2、Break3等。我目前正在用下面的查询循环数据,但问题在于生成的报告在每组数据之间留下了间隙。所以,我必须投入 Excel,删除空格并将它们全部放在一个数据集中。有没有更好的方法来获取数据,使其没有空白?我的想法是创建一个临时表并将每个循环中的数据插入其中,但这有点超出我的想象。任何帮助将不胜感激。

查询示例:

DECLARE @zone integer

DECLARE ZoneCursor CURSOR FOR
SELECT ZoneID 
FROM Zone 
ORDER BY  ZoneID
OPEN ZoneCursor

FETCH NEXT FROM ZoneCursor into @zone

WHILE @@FETCH_STATUS = 0
BEGIN

    EXEC(' SELECT 
    CONVERT(smallint, '''+ @zone+''')  as ZoneID')
    ...
    FROM BREAK'+ @ZONE +' B (NOLOCK) 

    FETCH NEXT FROM ZoneCursor into @zone
  END
  CLOSE ZoneCursor

结果示例:

ZoneID  Zone    NetworkID   Network Break_Date  Break_Time
------  ------- ---------   ------- --------------  --------------------------------
(0 row(s) affected)             

ZoneID  Zone    NetworkID   Network Break_Date  Break_Time
------  ------  ---------   ------- --------------  --------------------------------
2   ALPHARETTA-2538 1   CNN 4/1/2013    0:15:00
2   ALPHARETTA-2538 1   CNN 4/1/2013    0:15:00

ZoneID  Zone    NetworkID   Network Break_Date  Break_Time
------  ------- ---------   ------- --------------  --------------------------------
3   NEWTON-5491 1   CNN 4/1/2013    0:15:00
3   NEWTON-5491 1   CNN 4/1/2013    0:15:00
4

2 回答 2

0

是的,当您进入临时表时插入记录,然后在最后选择整个临时表?

首先,在光标之前,使用 create table 创建临时表结构。临时表以 # 开头,否则创建语句完全相同。

然后将插入部分添加到您拥有的动态 SQl(插入可以使用选择语句而不是值语句)。由于您现在插入的是插入而不是选择,因此您将不会返回任何结果。因此,在光标之后,您需要从临时表中选择 *。

(当然,我不得不说这是一个糟糕的数据库设计。是否可以使用一个表来代替?或者至少创建一个包含所有这些表的视图,并在添加新表时调整视图?)

于 2013-10-03T14:19:41.687 回答
0

有两种选择。第一个是 UNION 运算符,它允许您将所有内容加入到单个查询中:

SELECT ZONEID FROM BREAK1 (NOLOCK) 
UNION
SELECT ZONEID FROM BREAK2 (NOLOCK) 

第二个选项是创建一个临时表,选择其中,然后在循环结束时,从中选择。

DECLARE @RESULTS TABLE ( ZONEID INT )
INSERT INTO @RESULTS SELECT ZONEID FROM BREAK1
INSERT INTO @RESULTS SELECT ZONEID FROM BREAK2
SELECT ZONEID FROM @RESULTS

由于您使用 EXEC 语句在循环中执行此操作,因此如果您使用 UNION 路由,那么您可以构建一个大的选择字符串并触发单个 EXEC。如果您走第二条路线,则在循环之前生成临时表,并在循环关闭后从中选择。

于 2013-10-03T14:19:57.803 回答