2012-07-05 82 views
0

我們有一個進程獲取表列和每個應具有的大小(varchar類型)的列表,並修改它們以確保它具有已定義的大小。檢查列大小+直接修改表或更改表

在我們直接執行ALTER TABLE到列表中的每個列的實際執行...

會運行速度更快,如果我們第一次檢查,如果列大小是正確的尺寸不同,然後才做改變表格?

據統計有4000左右的表列檢查和20列需要最多修正...

+0

表列及其大小都存儲在特定的表和我們循環遍歷它 – VSP

+0

如果列和它們的大小可以作爲單個行集訪問,那麼在行集上執行查詢並過濾掉不需要更改的列應該是微不足道的。 *然後*您將繼續像現在一樣循環執行剩餘的行。那有意義嗎? –

回答

0

最終我們實現ALTER TABLE前檢查,有它在哪裏necesary執行ALTER命令的情況下低%的proccess尤其是運行速度更快

2

編輯:爲了反映意見:

什麼是快取決於如何昂貴的操作修改列連同需要更改的表中有多少列。例如改變一列零值不是很花錢。但是如果你有很多數據,並且表中有許多列,那麼可以更好地爲新表副本創建一個表。根據您的數據庫的指標決定這一點,並不總是一個正確和錯誤的問題。

您可能會創建一些動態sql來創建sql,以改變不適合大小的列的長度。這應該是最快的方法。

類似:

SELECT 
    'some decision logic...' -- substitute values as needed 
FROM 
     INFORMATION_SCHEMA.COLUMNS 
WHERE 
     ISNULL(CHARACTER_MAXIMUM_LENGTH, 5) <> 5 
    AND DATA_TYPE = 'NVARCHAR' 

而且你可以在你想解釋,表的大小,列的數據大小號(組)等

SQL服務器已經存儲的指標增加所有這些元數據,你可以查詢它。似乎錯誤的是在自定義表格中複製此信息並在其上運行光標。我想你提到的問題是,複製這些信息可能會導致陳舊的數據,而sql服務器元數據將始終保持最新狀態。爲了使它更容易,您可以創建元數據視圖以使其易於消費。但這是一個不同的問題。

+0

這些列屬於不同的表,當嘗試每個更改時,可能會出現像使用索引,約束,數據將被截斷等錯誤...所以我們必須分別自動記錄或更正每個更改表 – VSP

+0

好吧,然後使用此創建表和列的列表。使用這個列表來了解你所檢查的內容更好。 –

+0

主要問題是:什麼運行速度更快,檢查大小是否有問題,然後直接更改表或更改表? – VSP