32

我的存储过程接受两个参数 @EffectiveStartDate DATETIME
@EffectiveEndDate DATETIME

我这样编写验证代码:

IF(@EffectiveStartDate > @EffectiveEndDate)
        BEGIN
            RAISERROR ('SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',11,1,CAST(@EffectiveStartDate AS varchar(30)),CAST(@EffectiveEndDate AS varchar(30)));
            RETURN -1
        END 

我可以知道我在这里做错了什么。

在编译我的 SProc 时,它引发了消息“CAST() 附近的语法不正确”

4

3 回答 3

35

提供的值必须是常量或变量。您不能将函数名称指定为参数值。(来自 MSDN执行存储过程)。

你需要做这样的事情:

declare @EffectiveStartDateText varchar(30)
set @EffectiveStartDateText = cast(@EffectiveStartDate as varchar)

declare @EffectiveEndDateText varchar(30)
set @EffectiveEndDateText = cast(@EffectiveEndDate as varchar)

RAISERROR (
    'SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',
    11,
    1,
    @EffectiveStartDateText,
    @EffectiveEndDateText);
于 2011-05-31T00:15:35.627 回答
3

FORMATMESSAGE的文档说“有关错误消息中允许的占位符和编辑过程的更多信息,请参阅RAISERROR (Transact-SQL)。” 这似乎真的意味着 RAISERROR 应该以与 FORMATMESSAGE 相同的方式工作。

由于您可以在 FORMATMESSAGE 的参数中使用 CONVERT(但不能使用 CAST),如果暗示为真,那么您可以在 RAISERROR 的参数中使用 CONVERT,这将允许一个甜美而优雅的单行。

但是 SQL Server 不起作用(如您所料)。然而,至少它可以简单一点:你只需要声明一个变量,而不是两个:

DECLARE @ErrorMessage NVARCHAR(1000);
SET @ErrorMessage= FORMATMESSAGE('SPName: InsertUpdateLiquidityDateRule:  Start Date: %s cannot  be greater than End Date %s',
    CONVERT (VARCHAR(30), @EffectiveStartDate, 23),
    CONVERT (VARCHAR(30), @EffectiveEndDate, 23)
    );

RAISERROR (@ErrorMessage, 11, 1);

(SQL Server 2016 SP2-CU12)

Erland Sommarskog (自 2001 年以来的 SQL Server MVP)在这里很好地总结了这一点:“我觉得 SQL Server 是故意设计成尽可能令人困惑的”。并且“如果你在某个时候跑到门口尖叫甲骨文,回来吧,一切都被原谅了,我不能怪你”。

于 2020-06-22T19:29:47.163 回答
0

只是想帮忙,这是另一个例子。我在 BEGIN TRY 之后把它放在 BEGIN CATCH 语句中。

注意:这与使用 if 语句非常相似。

BEGIN TRY
--Do something.
END TRY 

BEGIN CATCH
    --Else on error do this.
    PRINT 'Problem found!!! ' 

    -- Whoops, there was an error
    -- Raise an error with the details of the exception
    DECLARE @ErrMsg nvarchar(4000), 
            @ErrSeverity int, 
            @ErrLineNum int

    SELECT @ErrMsg = ERROR_MESSAGE(), 
           @ErrSeverity = ERROR_SEVERITY(), 
           @ErrLineNum = ERROR_LINE()

    RAISERROR(@ErrMsg, @ErrSeverity, 1, @ErrLineNum)

END CATCH
于 2017-02-12T07:11:10.517 回答