2016-09-19 47 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