2016-10-21 1 views
1

おはようございます、私はテーブルから特定の行を移動する方法を理解しようとしています。ここはキッカーです。このアクティブな表の各行は、日付の書式がYのyyyymmddの文字Dです(たとえば、今日はD20161020)。私がやろうとしているのは、先月のすべての行(たとえば、D201609 ##)をアーカイブテーブルに移動することです(コピーした行をコピーしてから削除します)。アーカイブストアドプロシージャ

私の計画と考えは、現在のデータをできるだけ早くリーンに保つことです。そして、私はインデックスを使用しています、私はテーブルをそれほど大きくしたくありません。 :)毎日、3000+のレコードをそのテーブルにインポートします。スリムさのために、私はマスターレコードテーブルにレコードIDを参照しています。基本的に、このテーブルには、マスタレコードテーブルRecIDに対するRecID外部キーとその形式Dyyyymmddの日付があります。その日のカウントを対応するレコードに配置します。

ここでもう1つのことは、現在の月のデータのみをアクティブな表に保存することです。

年単位でアーカイブテーブルを保持する予定です。つまり、その年のデータを保持する2016counts、2017countsです。

年次アーカイブテーブルの図を作成するには、現在のアーカイブテーブルのすべてのデータを年間アーカイブにコピーし、そのアクティブなテーブルを切り捨てるプロシージャを作成するだけです。または、テーブルの名前を変更し、アクティブなアーカイブテーブルにレコードのマスターテーブルからの相関レコードIDである最初の列を除いて何も持たないため、空白のテーブルを再作成します。

+0

いくつかのサンプルデータで説明し、最終出力を表示してください – TheGameiswar

+1

実際に "列"を移動することを意味しましたか?あなたは "行"を移動したいという意味ではありませんか? –

+0

@TT。私はその仮定を作りました、うまくいけばそれは正しい仮定でした。 – Tanner

答えて

1

ここには、あなたが何をする必要があるかの大部分が含まれているサンプルがあります。うまくいけば、コメントはそれぞれのステップが何をしているのかを自明に説明します。以下のコードは再実行可能ですので、生成された出力を表示して微調整してさまざまなバリエーションをテストすることができます。

CREATE TABLE #Main (DateVal NVARCHAR(15) -- should be a date really!!! 
        ) 

CREATE TABLE #Archive (DateVal NVARCHAR(15) -- should be a date really!!! 
         ) 

INSERT INTO #Main 
     (DateVal 
     ) 
     SELECT 'D20161001' 
     UNION ALL 
     SELECT 'D20161002' 
     UNION ALL 
     SELECT 'D20161003' 
     UNION ALL 
     SELECT 'D20161004' 
     UNION ALL 
     SELECT 'D20160913' 
     UNION ALL 
     SELECT 'D20160911' 
     UNION ALL 
     SELECT 'D20161007' 
     UNION ALL 
     SELECT 'D20160901' 

-- values as they are 
SELECT DateVal 
FROM #Main 

-- values with dates formatted from values and month extracted 
SELECT DateVal , 
     RIGHT(DateVal, 8) AS DateSection , 
     CAST(RIGHT(DateVal, 8) AS DATE) ConvertedToDate , 
     DATEPART(MONTH, (CAST(RIGHT(DateVal, 8) AS DATE))) MonthPart 
FROM #Main 

-- values not in current month - to archive 
SELECT DateVal , 
     RIGHT(DateVal, 8) AS DateSection , 
     CAST(RIGHT(DateVal, 8) AS DATE) ConvertedToDate , 
     DATEPART(MONTH, (CAST(RIGHT(DateVal, 8) AS DATE))) MonthPart 
FROM #Main 
WHERE DATEPART(MONTH, (CAST(RIGHT(DateVal, 8) AS DATE))) < DATEPART(MONTH, 
                   GETDATE()) 

-- insert the archived records 
INSERT INTO #Archive 
     (DateVal 
     ) 
     SELECT DateVal 
     FROM #Main 
     WHERE DATEPART(MONTH, (CAST(RIGHT(DateVal, 8) AS DATE))) < DATEPART(MONTH, 
                   GETDATE()) 

-- delete the archived records 
DELETE #Main 
WHERE DATEPART(MONTH, (CAST(RIGHT(DateVal, 8) AS DATE))) < DATEPART(MONTH, 
                   GETDATE()) 

-- see what's archived 
SELECT * 
FROM #Archive 

-- see what's active 
SELECT * 
FROM #Main 

DROP TABLE #Main 
DROP TABLE #Archive 
+0

今日私はこれをちょっと試してみましょう。私がやろうとしているものに似ています。私はあなたに戻ってきます。ありがとう:) – bbcompent1

+0

私はストアドプロシージャに組み込まれている動的クエリを使用して終了しました。私が今必要とするのは、動的SQLを使用して先月のレコードを削除することですが、計算することによって月と年を決定する必要があります。私はあなたのテンポラリテーブルの使い方が好きです。 procを見るには、https://forums.asp.net/post/6091304.aspx – bbcompent1

+0

にリンクがありません。フォローアップの質問がある場合は別の質問をしてください。質問はあまり変わらないので、私の答えは意味をなさない。 – Tanner