抑制IGNORE_DUP_KEY生成的T-SQL警告

时间:2010-01-08 21:30:20

标签: sql-server sql-server-2005 suppress-warnings

有没有办法通过在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;

这类似于How do I suppress T-SQL warnings when running a script SQL Server 2005?,但在这种情况下解决方案不起作用。我也看到了使用TRY ... CATCH的建议,但这也不起作用:它似乎无法捕捉到警告。

我正在使用SQL Server 2005。

1 个答案:

答案 0 :(得分: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