2011-09-13 9 views
2

こんにちは、私は今、しばらくの間これを苦労してきました!私はそれらの中に日付を持ついくつかのデータファイルを持っています、これらはステージングテーブルにダンプされます。私がスクリプト/機能を実行したいのは、ステージングテーブルの各レコードの日付を読み取り、適切なテーブルに移動することです。今、私はそれがダイナミックになりたいので、私はに渡す機能/ストアドプロシージャの線に沿って何かを考えていたが、単に例ダイナミックテーブルTSQLを挿入

INSERT INTO TABLE_2011_08 
WHERE Datafields = 2011_08 

のために、いくつかの静的な挿入を使用して非常に簡単にこれを行うことが知っています各レコードの日付。しかし、私の脳はこれで少し溶けています!ステージング表で

データレコードは、このようなものが考えられます。 -

RecordA 2011-08-30 Data Data Data 
RecordB 2011-08-31 Data Data Data 
RecordC 2011-09-01 Data Data Data 
RecordD 2011-09-02 Data Data Data 

答えて

2

テーブルTはあなたのテーブルに似ていますが、あなたの近くのテストデータを入力しました。あなたが存在しないテーブルが作成されます。この構文は、必要な場合はTABLE_YYYY_MMのようなテーブルを作成し、移入します

CREATE TABLE T(name varchar(10), date datetime) 

insert t values('RecordA','2011-08-30') 
insert t values('RecordB','2011-08-31') 
insert t values('RecordC','2011-09-01') 
insert t values('RecordD','2011-09-02') 

あなたのテーブルを再作成する

試み。 YYYYとMMは任意の組み合わせです。テーブルT

Declare @tablename varchar(64) 
Declare @sql as varchar(max) 
Declare @d as datetime 
Declare dCursor CURSOR FAST_FORWARD FOR 
SELECT DISTINCT dateadd(month, datediff(m, 0, date), 0) date from t 
OPEN dCursor 
FETCH NEXT FROM dCursor 
INTO @d 
WHILE @@FETCH_STATUS = 0 
BEGIN 
SET @tablename = '[TABLE_'+replace(CONVERT(VARCHAR(7), @d, 121), '-', '_') + ']' 
SET @SQL = 
'if OBJECT_ID('''[email protected]+''', ''U'') is null 
BEGIN 
Declare @sql2 varchar(max) 
SET @sql2 = ''SELECT * INTO '[email protected]+' 
FROM t WHERE 1 = 2'' 
EXEC(@sql2) 
END 
INSERT INTO '+ @tablename+' 
SELECT * FROM t 
WHERE datediff(m, 0, date)=' + CAST(datediff(m, 0, @d) AS VARCHAR(10)) 

EXEC(@SQL) 
FETCH NEXT FROM dCursor 
INTO @d 

END 
CLOSE dCursor 
DEALLOCATE dCursor 
+0

ありがとう、これは私が後にしたものです:) –

3

私はあなたが正しい、あなたが動的に変化するテーブル名を持つINSERT文を生成したい理解していれば?

あなたは文字列としてSQLクエリを構築し、EXECでそれを実行することができます。

DECLARE @sql nvarchar(MAX) 
SELECT @sql = N'INSERT ' + @tableName + ' VALUES (...)' 

EXEC (@sql) 

あなたのデータのルーティングを実現するための最も簡単な方法は、カーソルを使用してステージングデータを反復処理し、動的な挿入SQL文字列を作成することですそのループで

その後、単一のEXECコマンドで挿入バッチを実行します。ここで

+0

はい、本質的には私がしたいことです。ただし、各レコードの日付フィールドを読み取る必要があります。ステージングテーブルには2011-08と2011-09のデータがありますが、適切なデータが適切なテーブルに送られます。したがって、2011-08年のデータは2011-08の表に、2011-09のデータは2011-09の表のみになります。 –

+0

私は私の答えを編集しました:あなたのステージングテーブル上にカーソルを置いて繰り返し、データ行ごとに1つのINSERTを作成してください。 – Jan

4

あなたが行く:

CREATE TABLE dbo.Some_Meaningful_Descriptive_Name (
    record_id CHAR(7)  NOT NULL, 
    some_date DATETIME  NOT NULL, 
    some_data VARCHAR(20) NOT NULL, 
    ... 
) 

は、今すぐあなたのインポートプロセスは、ちょうどテーブルに入れなければなりません。ダイナミックな要件はなく、毎月新しいテーブルを作成する必要はありません。

あなた本当には、彼らは、テーブルの上にビューを作成し、別見えるようにする必要がある場合:

CREATE VIEW dbo.Some_Meaningful_Descriptive_Name_2011_08 
AS 
BEGIN 

    SELECT 
     record_id, 
     some_data 
    FROM 
     dbo.Some_Meaningful_Descriptive_Name 
    WHERE 
     some_date >= '2011-08-01 00:00:00.000' AND 
     some_date < '2011-09-01 00:00:00.000' 
END 

あなたが実際に別々にそれらを配置する必要があり非常に多くの行を持っているとき、かなり珍しいことになるだろうテーブル。 (私たちは何百万行もの行を話しています)。パーティショニングを行うと、おそらくそれは必要ないでしょう。

これらのテーブルを別々のテーブルに配置するだけで、将来的にそれらを扱うのが難しくなります。

+0

はい、間違ったデザインを修正してください。 +1 000,000 – HLGEM