0

SQL Server 2008 を実行しています。増分名を持つテーブルをクエリする必要があります。これらのテーブルの構造はまったく同じで、すべて (~50) のテーブルからデータを取得する必要があります。テーブルの命名規則は、Break1、Break2、Break3 などです。現在、以下のクエリでデータをループしていますが、生成されたレポートが各データ セット間にギャップを残すという問題があります。そのため、Excel に投入し、スペースを削除して、それらをすべて 1 つのデータ セットにまとめる必要があります。ギャップがないようにデータを取得するより良い方法はありますか? 私の考えでは、一時テーブルを作成し、各ループからのデータをそこに挿入することでしたが、それは私の頭を少し超えています。どんな助けでも大歓迎です。

クエリの例:

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 に追加します (挿入では、values ステートメントの代わりに select ステートメントを使用できます)。選択する代わりに挿入しているため、結果は返されません。したがって、カーソルの後に、一時テーブルから * を選択する必要があります。

(もちろん、これはデータベースの設計が悪いと言わざるを得ません。代わりに 1 つのテーブルを使用することは可能ですか? または、少なくともこれらすべてのテーブルを含むビューを作成し、新しいテーブルが追加されたときにビューを調整しますか?)

于 2013-10-03T14:19:41.687 に答える
0

思いつくオプションは 2 つあります。1 つ目は、すべてを 1 つのクエリに結合できるようにする UNION 演算子です。

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

2番目のオプションは、一時テーブルを作成し、それを選択してから、ループの最後でそれを選択することです。

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 を起動するだけです。2 番目のルートに進む場合は、ループの前に一時テーブルを生成し、ループが閉じた後にそこから選択します。

于 2013-10-03T14:19:57.803 に答える