我正在运行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
答案 0 :(得分:0)
是在进入临时表时插入记录,然后在结尾处选择整个临时表?
首先,在光标之前,使用create table创建临时表结构。临时表以#开头,但是create语句完全相同。
然后将插入部分添加到您拥有的动态SQl(插入可以使用选择语句而不是值statemenet)。由于您现在插入的不是选择,您将不会返回任何结果。因此在光标之后,您需要从临时表中选择*。
(当然,我必须说这是一个糟糕的数据库设计。是否可以使用一个表?或者至少创建一个包含所有这些表的视图并在添加新表时调整视图?)< / p>
答案 1 :(得分: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。如果你走第二条路线,那么在你的循环之前生成临时表,并在循环结束后选择它。