2013-10-25 187 views
1

我使用SQL Server 2008 R2,我的問題是這是一個名爲LogStats的數據庫。如何將一列從一個表複製到另一個表在SQL Server中

如果我執行這個查詢:

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 

結果:

消息9002,級別17,狀態4,第1行的事務日誌數據庫 'LogStats' 已滿。要找出爲什麼日誌中的空間不能被重用, 請參閱sys.databases的log_reuse_wait_desc列。

我嘗試這樣做:

SELECT name,log_reuse_wait_desc FROM sys.databases 

從結果

tempdb ACTIVE_TRANSACTION 
LogStats ACTIVE_TRANSACTION 

哪有我放棄那些活躍的交易,這樣任務可以成功?

回答

1

如何中止這些活動事務以便任務可以成功ul?

你不能,因爲它是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 

如果數據庫簡單恢復模式這應該工作,如果FULL或BULK_LOAD您還需要在每次迭代中備份事務日誌。

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 

,因爲你要更新ExceptionRow.Message當空與HashFP.MessageFP我們沒有必要理會是否HashFP.MessageFP有它的空..

相關問題