2009-06-16 57 views
0

我正在尋找一種乾淨的方式來使用存儲過程轉發一些演示數據。我想轉發的數據是日期類型。由於我的應用程序的性質,我的應用程序中的某些數據只會在數據中的某些日期處於未來時纔會顯示。我希望這是有道理的。 :S如何使用存儲過程轉發演示數據日期?

由於我的數據庫不斷擴大,我想編寫一個存儲過程,而在我的數據庫屬於一個演示用戶帳戶中的所有表基本上轉發所有日期。我還會記錄演示數據最後轉發的日期。顯然,存儲的proc將在登錄演示數據時運行,並且當轉換演示數據的最後日期與當前日期之間存在一定的時間差(例如30天)之間的差異時。這樣我就不必更改腳本了。

我們的技術部分:

我用這來檢索數據庫中的所有表:

Select 
    table_name 
from 
    Information_Schema.Tables 
Where 
    TABLE_TYPE like 'BASE TABLE' 
    and table_name not like 'Report_%' 
    and table_name not in ('Accounts', 'Manifest', 'System', 'Users') 

我需要的是一種方法,通過該表名迭代,找到列名稱和列類型。然後我希望更新每個類型爲datetime的表中的所有列。我已經閱讀SQL中的循環並不理想,但我想盡量減少數據庫調用的數量,而不是將其放在服務器端代碼上。

我要去沿着錯誤的道路來解決這個問題?

在此先感謝。

+1

你不知道哪些列需要遞增先驗?將架構中的每個日期提前30天似乎是個不錯的主意。如果有人出現並添加了不應增加的日期列,該怎麼辦? – 2009-06-16 01:16:57

回答

0

我的評論認爲,它可能不是一個好主意,並自動以隱藏方式做到這一點,但如果你願意,你可以用這個。

(注意:這裏假設SQL Server)的

select T.Name, C.Name 
from sys.tables T 
join sys.columns C 
on T.object_id = C.object_id 
and C.system_type_id = 61 -- I would do a little researcht o make sure 61 is all you need to return here 

這將讓你的所有日期時間列的列表,它是由名稱表一起。

然後我會完成它的方式是有其基礎上動態更新串光標,和exec他們有點像:

DECLARE @UpdateString varchar(500) 
DECLARE @DaysToAdd int 
DECLARE @TableName VARCHAR(100) 
DECLARE @ColumnName VARCHAR(100) 

set @DaysToAdd = 10 

DECLARE db_cursor CURSOR FOR 
select T.Name, C.Name 
from sys.tables T 
join sys.columns C 
on T.object_id = C.object_id 
and C.system_type_id = 61 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 
set @UpdateString = 'Update ' + @TableName + ' set ' + @ColumnName + ' = dateadd(dd, ' + cast(@DaysToAdd as varchar) + ', ' + @ColumnName + ') where ...' 
exec(@UpdateString) 
    FETCH NEXT FROM db_cursor INTO @TableName, @ColumnName 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

有很多事情我不喜歡這個,光標時,實際上它在幕後,而exec調用,連同我不能確定你將如何「只更新測試數據」,因爲它會很辛苦寫的WHERE子句在數據庫中的通用表。但我認爲這會讓你開始。

在側面,也許你應該考慮具有可以運行插入滿足您的需求日期的新數據的一些測試數據填充腳本。