2010-01-08 3 views
2

Есть ли способ подавить предупреждения, созданные путем вставки повторяющихся ключей в индексы с IGNORE_DUP_KEY = ON? Предупреждение, которое оно дает, - «Дублирующий ключ был проигнорирован».Запретить предупреждения T-SQL, созданные IGNORE_DUP_KEY

Я изучаю эту опцию с переменной таблицы по соображениям производительности, но она генерирует много предупреждающих сообщений. Это может быть проблемой, так как я записываю вывод моего сценария в текстовый файл, и я не хочу, чтобы файл журнала заполнял сотни строк этого предупреждения снова и снова.

Предупреждения могут быть воспроизведены со следующим сценарием. Примечание. Это не мой фактический сценарий, а просто пример для иллюстрации.

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

Что делать, если вы удалили «С (IGNORE_DUP_KEY = ON)» вариант из декларации таблицы и вместо завернутые Добавленное заявление с помощью Try/поймать блок. См. Пример ниже:

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