1

我的 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语句开始,也需要返回输出,所以我的语句中会有两个选择语句。

如果我没有IF声明就写它,一切都很好。

4

1 回答 1

3

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

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
于 2012-04-23T02:47:12.080 回答