2

有没有办法抑制通过在 IGNORE_DUP_KEY = ON 的索引上插入重复键而产生的警告?它给出的警告是“重复键被忽略”。

出于性能原因,我正在研究将此选项与表变量一起使用,但它会生成大量警告消息。这可能是一个问题,因为我将脚本的输出记录到文本文件中,并且我不希望日志文件一遍又一遍地填满数百行此警告。

可以使用以下脚本重现警告。注意:这不是我的实际脚本,而只是用于说明目的的示例。

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;

这类似于运行脚本 SQL Server 2005 时如何抑制 T-SQL 警告?,但在这种情况下,那里的解决方案不起作用。我还看到了使用 TRY...CATCH 的建议,但这也不起作用:看来您无法捕获警告。

我正在使用 SQL Server 2005。

4

1 回答 1

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
于 2010-01-09T05:15:32.820 回答