【问题标题】:Suppress T-SQL warnings generated by IGNORE_DUP_KEY禁止 IGNORE_DUP_KEY 生成的 T-SQL 警告
【发布时间】:2011-01-03 02:32:27
【问题描述】:

有没有办法抑制通过在 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。

【问题讨论】:

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


    【解决方案1】:

    如果您从表声明中删除“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
    

    【讨论】:

    • 那不具有相同的行为。如果没有 IGNORE_DUP_KEY,单个错误会导致整个事务失败。因此,例如,如果我尝试插入 4、13 和 57,如果 4 已经在表中,则不会插入 13 和 57。开启 IGNORE_DUP_KEY 后,13 和 57 都将被插入,但不会再次插入 4。
    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2010-09-12
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多