2011-09-13 68 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與您的表類似,我使用接近您的測試數據填充表,如果它們不存在,您填充的表將被創建。

嘗試重新創建表

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') 

此語法,如果需要創建和填充像TABLE_YYYY_MM表。 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

我已經編輯了我的答案:用遊標在迭代表中迭代,併爲每個數據行創建一個'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