1

此更新将失败,因为 ID 是身份

但我收到直接的错误消息。
我没有收到任何 PRINT 语句。

如何使用@@ERROR?
使用 SSMS。
你会称之为脚本还是查询?

PRINT   'start';
DECLARE @ErrorVal INT;
UPDATE IndenText SET ID = 7;
SELECT @ErrorVal = @@ERROR;
PRINT @ErrorVal;
IF @ErrorVal <> 0
BEGIN
    PRINT N'A error caught.';
END
PRINT 'done';

这对我也不起作用

PRINT   'start';
DECLARE @ErrorVal INT;
BEGIN TRY
    UPDATE IndenText SET ID = 7;
    SELECT @ErrorVal = @@ERROR;
    PRINT @ErrorVal;
END TRY
BEGIN CATCH
    IF @@ERROR <> 0
    BEGIN
        PRINT N'A error caught.' + @@ERROR;
    END
END CATCH
PRINT 'done';

我收到
消息 8102,级别 16,状态 1,第 4 行无法更新标识列“ID”。

正如马丁所说,这是一个编译错误。
创建了一个不会成为编译错误的约束。
并得到@@ERROR 来处理。

PRINT   'start';
DECLARE @ErrorVal INT;
DECLARE @newVal INT;
select  @newVal = -1;
BEGIN TRY
    update Twaste1 set ID = @newVal ;
    PRINT 'End Try';
END TRY
BEGIN CATCH
    Select @ErrorVal = @@ERROR;
    PRINT 'Begin Catch';
    IF @ErrorVal <> 0
    BEGIN
        PRINT CAST(@ErrorVal as varchar(30));
        PRINT N'A error caught.';
    END
END CATCH
PRINT 'done'

;

4

2 回答 2

2

例如对于更新使用:

UPDATE HumanResources.EmployeePayHistory
SET PayFrequency = 4
WHERE BusinessEntityID = 1;

IF @@ERROR = 547 PRINT N'发生检查约束冲突。'; 去

于 2012-09-28T17:22:23.583 回答
1

我建议TRY... CATCH改用。这将允许您捕获并检查引发的错误。

更新:

我相信 Martin 已经在他对原始问题的评论中解释了为什么这不起作用,但我将添加对 MSDNTRY... CATCH文章的引用:

以下类型的错误发生在与 TRY...CATCH 构造相同的执行级别时,不会由 CATCH 块处理:

  • 编译错误,例如语法错误,阻止批处理运行。
  • 在语句级重新编译期间发生的错误,例如由于延迟名称解析而在编译后发生的对象名称解析错误。
于 2012-09-28T17:09:46.267 回答