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、出力も返す必要があるので、ステートメントには2つのselectステートメントがあります。

文なしで書けばIF大丈夫です。

4

1 に答える 1

3

コードは次の構造に従う必要があります。

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

2番目の条件には合法ではない中括弧があり、特定の状況を除いて、最初の条件本体では括弧が合法/必要ではありません(少なくとも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 に答える