2016-09-19 44 views
0

我有一個表被截斷,每天加載的數據問題是截斷表需要一段時間,用戶注意到這一點。我想知道的是,有沒有辦法讓兩個相同的表格和截斷一個然後加載新的數據,然後讓用戶用戶那個新表,並只是在兩個表之間切換。SQL Server表交換

+2

在這裏有很多超級聰明和有經驗的人。如果您詳細介紹了存儲的內容,存儲的原因以及截斷的原因,您將獲得更多有用的響應。還包括任何語言/軟件/版本信息。 – Kieveli

+0

雖然'TRUNCATE'很快,它將需要架構修改鎖;它將被併發活動阻止,反之亦然。 'SWITCH'也是如此,它可以用作交換設計的一部分。 「SWITCH」的優點是負載可以單獨發生。 –

+0

也許你可以用同義詞做到這一點。讓用戶只知道同義詞並將其從一個表切換到另一個表 – Turo

回答

0

如果您正在清除舊錶以及填充新表,可以使用OUTPUT子句。注意日誌增長的潛力,如果這可能是一個問題,考慮循環/批處理方法。

DELETE 
    OldDatabase.dbo.MyTable 
OUTPUT 
    DELETED.col1 
    , DELETED.col2 
    , DELETED.col3 
INTO 
    NewDatabase.dbo.MyTable 

或者你可以使用BCP這是一個方便的選擇要注意。請注意,這是使用SQLCMD語法。

:setvar SourceServer OldServer 
:setvar SourceDatabase OldDatabase 
:setvar DestinationServer NewServer 
:setvar DestinationDatabase NewDatabase 
:setvar BCPFilePath "C:\" 

!!bcp "$(SourceDatabase).dbo.MyTable" FORMAT nul -S "$(SourceServer)" -T -n -q -f "$(BCPFilePath)MyTable.fmt" 
!!bcp "SELECT * FROM $(SourceDatabase).dbo.MyTable WHERE col1=x AND col2=y" queryout "$(BCPFilePath)MyTable.dat" -S "$(SourceServer)" -T -q -f "$(BCPFilePath)MyTable.fmt" -> "$(BCPFilePath)MyTable.txt" 
!!bcp "$(DestinationDatabase).dbo.MyTable" in $(BCPFilePath)MyTable.dat -S $(DestinationServer) -T -E -q -b 2500 -h "TABLOCK" -f $(BCPFilePath)MyTable.fmt