2010-01-08 63 views
2

有沒有辦法通過在IGNORE_DUP_KEY = ON的索引中插入重複鍵來生成警告?它給出的警告是「重複密鑰被忽略。」抑制由IGNORE_DUP_KEY生成的T-SQL警告

由於性能原因,我正在調查使用此選項和表變量,但它會生成很多警告消息。這可能是一個問題,因爲我將腳本的輸出記錄到文本文件中,而且我不希望日誌文件一遍又一遍地填滿數百行此警告。

警告可以通過以下腳本進行復制。注意:這不是我的實際腳本,而僅僅是用於說明的一個例子。

SET NOCOUNT ON; 
SET ANSI_WARNINGS OFF; 

DECLARE @data TABLE (x int NOT NULL PRIMARY KEY); 
DECLARE @i int; 

SET @i = 1; 
WHILE @i <= 1000 
BEGIN 
    INSERT INTO @data (x) VALUES (@i); 
    SET @i = @i + 1; 
END; 

DECLARE @test TABLE (x int NOT NULL PRIMARY KEY WITH (IGNORE_DUP_KEY = ON)); 
SET @i = 2; 
WHILE @i <= 1000 
BEGIN 
    INSERT INTO @test (x) SELECT x FROM @data WHERE (x % @i) = 0 AND x > @i 
    SET @i = (SELECT MIN(x) FROM @data d WHERE x > @i 
     AND NOT EXISTS (SELECT 1 FROM @test t WHERE t.x=d.x)); 
END; 

SELECT COUNT(*) FROM @test; 

這類似於How do I suppress T-SQL warnings when running a script SQL Server 2005?,但解決的辦法有沒有在這種情況下工作。我也看到了使用TRY ... CATCH的建議,但這也不起作用:看起來你不能捕獲警告。

我使用SQL Server 2005的

回答

0

如果你去掉了「WITH(IGNORE_DUP_KEY = ON)」從表聲明選項,而不是使用try/catch塊包裹着你的INSERT語句。看下面的例子:

BEGIN TRY 
    INSERT INTO @test (x) SELECT x FROM @data WHERE (x % @i) = 0 AND x > @i 
END TRY 
BEGIN CATCH 
    IF NOT (ERROR_NUMBER() = 2627 AND ERROR_SEVERITY() = 14) 
    PRINT 'Real error occurred.' 
END CATCH 
+0

這並不具有相同的行爲。沒有IGNORE_DUP_KEY,單個錯誤會導致整個事務失敗。所以,例如,如果我試圖插入4,13和57,如果4已經在表中,那麼13和57都不會被插入。 IGNORE_DUP_KEY打開時,將插入13和57,但不會再插入4。 – Tadmas 2010-01-10 00:52:47