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