如何在SQL Server中将一列从一个表复制到另一个表

时间:2013-10-25 05:48:58

标签: sql sql-server transactions sql-server-2008-r2

我使用的是SQL Server 2008 R2,而我的问题就是这个名为LogStats的数据库。

如果我执行此查询:

select *
from ExceptionRow
     inner join HashFP ON ExceptionRow.Hash=HashFP.FingerPrintMD5
where ExceptionRow.Message is null
      AND not HashFP.MessageFP is null 

我得到126708次点击,需要2.05分钟。但优化不是我的问题。

我想将数据从HashFP.MessageFP复制到ExceptionRow.Message而不会覆盖任何数据。我试试这个:

UPDATE ExceptionRow
SET Exceptionrow.Message = HashFP.MessageFP
FROM ExceptionRow 
     INNER JOIN HashFP ON ExceptionRow.Hash=HashFP.FingerPrintMD5
WHERE ExceptionRow.Message IS NULL
      AND NOT HashFP.MessageFP IS NULL

结果:

  

Msg 9002,Level 17,State 4,Line 1数据库的事务日志   'LogStats'已满。要找出为什么日志中的空间无法重用,   请参阅sys.databases中的log_reuse_wait_desc列

我试过了:

SELECT name,log_reuse_wait_desc FROM sys.databases

从结果

tempdb   ACTIVE_TRANSACTION
LogStats ACTIVE_TRANSACTION

如何中止这些活动交易以使任务成功?

2 个答案:

答案 0 :(得分:1)

  
    

如何中止这些活动交易以使任务成功?

  

你不能,因为它是UPDATE FROM交易。
您可以增加日志文件的最大大小:

ALTER DATABASE DB_NAME
MODIFY FILE (NAME=LOG_FILE_NAME,MAXSIZE=UNLIMITED);

或者您可以尝试这样的事情:

WHILE EXISTS
(select *
from ExceptionRow
     inner join HashFP ON ExceptionRow.Hash=HashFP.FingerPrintMD5
where ExceptionRow.Message is null
      AND not HashFP.MessageFP is null
)
UPDATE TOP (1000) ExceptionRow
SET Exceptionrow.Message = HashFP.MessageFP
FROM ExceptionRow 
     INNER JOIN HashFP ON ExceptionRow.Hash=HashFP.FingerPrintMD5
WHERE ExceptionRow.Message IS NULL
      AND NOT HashFP.MessageFP IS NULL

如果数据库具有SIMPLE恢复模型,这应该可行,如果FULL或BULK_LOAD,您还需要在每次迭代中备份事务日志。

答案 1 :(得分:0)

UPDATE ExceptionRow SET Exceptionrow.Message = HashFP.MessageFP FROM ExceptionRow 
INNER JOIN HashFP ON ExceptionRow.Hash=HashFP.FingerPrintMD5
WHERE ExceptionRow.Message IS NULL AND HashFP.MessageFP IS NOT NULL

UPDATE ExceptionRow SET Exceptionrow.Message = HashFP.MessageFP FROM ExceptionRow 
INNER JOIN HashFP ON ExceptionRow.Hash=HashFP.FingerPrintMD5
WHERE ExceptionRow.Message IS NULL 

因为当你使用 HashFP.MessageFP 来更新 ExceptionRow.Message 时,我们不需要打扰HashFP.MessageFP是否在其中为空...