Подавить предупреждения T-SQL, генерируемые IGNORE_DUP_KEY - PullRequest
2 голосов
/ 09 января 2010

Есть ли способ подавления предупреждений, генерируемых путем вставки повторяющихся ключей в индексы с 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;

Это похоже на Как подавить предупреждения T-SQL при запуске сценария SQL Server 2005? , но решение в этом случае не работает. Я также видел предложения по использованию TRY ... CATCH, но это тоже не работает: похоже, вы не можете перехватить предупреждения.

Я использую SQL Server 2005.

1 Ответ

0 голосов
/ 09 января 2010

Что если вы удалили опцию «WITH (IGNORE_DUP_KEY = ON)» из объявления таблицы и вместо этого заключили в оператор INSERT блок try / catch. Смотрите пример ниже:

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
...