【问题标题】:SQL IF statement IssueSQL IF 语句问题
【发布时间】:2012-04-23 02:42:15
【问题描述】:

我的 SQL 语句有什么问题?

ALTER PROCEDURE prGetDocById
    @Nbr varchar(100),
    @Type uniqueidentifier,
    @TotalRecord int output
AS
BEGIN
    IF(@Type is null)
    BEGIN
    (
        SELECT @TotalRecord = COUNT(Category) FROM Document where Nbr = @Nbr and 
            Type = (case when @Type IS not null then @Type else null end) 
        SELECT * from Document
    )
    end
    else
    begin
    (
        ...
    )
    end
end

它给了我这个错误:

消息 156,级别 15,状态 1,过程 prGetDocById,第 12 行
关键字“SELECT”附近的语法不正确。
消息 102,级别 15,状态 1,过程 prGetDocById,第 13 行
')' 附近的语法不正确。
消息 102,级别 15,状态 1,过程 prGetDocById,第 19 行
')' 附近的语法不正确。

我想以IF语句开头,也需要返回输出,所以我的语句中会有两个select语句。

如果我不写IF 语句,一切都OK。

【问题讨论】:

    标签: sql


    【解决方案1】:

    您的代码应遵循以下结构:

    IF( 1 = 1) BEGIN
        SELECT 1;
    END
    ELSE BEGIN
        SELECT 2;
    END
    

    您的第二个条件中有大括号不合法,并且括号在第一个条件主体中不合法/不必要(至少在 MS SQL Server 中不是),但在特定情况下除外。

    括号用法

    -- legal but pointless most of the time
    IF( 1 = 1) BEGIN
    (
        SELECT 1
    )
    END
    
    -- illegal
    IF( 1 = 1) BEGIN
    (
        SELECT 1;
    )
    END
    
    -- illegal
    IF( 1 = 1) BEGIN
    (
        SELECT 1
        SELECT 2
    )
    END
    

    具体查询

    我不明白这里的逻辑(CASE 似乎毫无意义),但我认为这在语法上是正确的。请注意,我将[Type] 放在括号中,因为它是保留字。

    IF( @Type IS NULL ) BEGIN
        SELECT 
            @TotalRecord = COUNT(Category) 
        FROM Document
        where Nbr = @Nbr and [Type] = (case when @Type IS not null then @Type else null end);
    
        SELECT * from Document;
    END
    ELSE BEGIN
        SELECT 0;
    END
    

    【讨论】:

    • @kevin IF 语句不需要括号
    • @kevin - 我添加了您的具体查询。
    • @TimMedora,是的,现在可以了。非常感谢。
    猜你喜欢
    • 2018-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-16
    • 2021-05-15
    • 2012-11-19
    相关资源
    最近更新 更多