使用RAISERROR在t-SQL中引发特定错误

时间:2011-10-28 09:41:38

标签: sql-server-2005 tsql raiserror

我有一个INSTEAD OF INSERT触发器的视图(在SQL Server 2005中)。当用户插入视图时,它们实际上是对许多表进行插入和更新。视图足够复杂,不能有索引,所以不幸的是不受约束。

正在使用可能有问题的代码从C#插入视图。此代码使用以下内容捕获主要和唯一密钥违规:

try
{
    ... // Insert into view
}
catch (SqlException ex)
{
    if (ex.Number == 2627 || ex.Number == 2601) // Primary key exception, unique constraint violation
    {
        ... // Report the duplicate entry to the user
    }
    else
    {
        throw;
    }
}

所以我的问题是:我可以在触发器中使用RAISERROR来创建数字为2627或2601的异常吗?

2 个答案:

答案 0 :(得分:1)

没有。你必须等待THROW in the next release(也许)

您只能抛出已放入sys.messages(50000+)或带有50000的文本的错误。或者将其嵌入文本并更改您的c#。您不能抛出小于50000的错误

如果视图太复杂而无法使用DRI,则复杂。此外,您还会遇到并发问题:重叠调用 会在您自己推出时突破您的“唯一性”。

答案 1 :(得分:0)

我不确定您是否真的RAISE真正的主要密钥违规。虽然您可以使用自己的消息RAISE自己的错误,然后catch。这还可以让您区分真正的主键违规和您自己的自定义违规。

也许最简单的方法就是......

SQL代码(可能在TRIGGER定义中)......

RAISERROR('Custom View Violation',16,1);

C#...

try 
{
    //execute SP / Insert etc...
}
catch (SqlException ex)
{
    if (ex.Message.Split('\r')[0] == "Custom View Violation")
    {
        //deal with your exception
    }
}