-1

次のパラメーター値が宣言された SQL Server 2008 R2 にストアド プロシージャがあります。

@UN nvarchar(30),
@SN nvarchar(8),
@GG uniqueidentifier,
@Ss irnapp.SymbolTableType READONLY,
@SD date,
@ED date,
@IR nvarchar(1),
@ID nvarchar(1),
@NR int = NULL,
@GP nvarchar(1) = N'N'

@GP 値が指定されていない場合は、N'N' の値を指定する必要があるというのが私の意図でした。ただし、このプロシージャは、@GP に N'N' を明示的に渡した場合にのみ、期待される結果を返します。

既定のパラメーター値を持つ SQL ストアド プロシージャの例を検索しようとしましたが、nvarchar で見つかった唯一の例は NULL の既定値であり、これは私のアプリケーションでは実行できません。

上記が正当なデフォルトパラメータ宣言であるかどうかは誰にも分かりますか?

アップデート:

迅速な対応をしてくれたアーロンに感謝します。コードが非常に長いため、これが簡単なキャッチになることを望んでいました。つまり、次のようになります。

  BEGIN TRY
    DECLARE @GI int;
    EXEC irn.GetGroupID @UN, @SN, @GG, @GI OUT;

    DECLARE @CUID int;
    IF @GP = N'Y'       
    BEGIN
        SELECT @CUID = UserID
            FROM Users
            WHERE Uname = @UN
                AND SNum = @SN;
    END;    

    DECLARE @NoteIDs irn.NoteIDTableType;

    INSERT INTO @NIDs (NO, NID)
        SELECT *
            FROM GetNIDs(@GI, @Ss, @SD, @ED, @IR, @ID, @NR, @GP, @CUID);

    EXEC GetNsByNIDs @NIDs, N'N';
END TRY
BEGIN CATCH
    EXEC irn.CreateProcedureErrorLog 
    EXEC irn.RaiseProcedureError 
END CATCH;




ALTER FUNCTION [i].[GetNIDs] (
    @GID int,
    @Ss SymbolTableType READONLY,
    @SD date,
    @ED date,
    @IR nvarchar(1),
    @ID nvarchar(1),
    @NR int,
    @GP nvarchar(1) = N'N',
    @CUID int = NULL)
RETURNS @TopOrderedMatchingNote TABLE (
    NO int NOT NULL PRIMARY KEY,
    NID    int NOT NULL UNIQUE)
AS
BEGIN


    INSERT INTO @MN (NID)
        SELECT NID
            FROM N
            WHERE GID = @GID
                AND ND >= @FDate
                AND ND <= @TDate
                AND IP = @GP
                AND ((IP = N'Y' AND CUID = @CUID)                           OR (IP = N'N'))
                AND IsDeleted = CASE @IncludeDeleted
                                    WHEN N'N' THEN N'N'
                                    ELSE IsDeleted
                                END;
END;

...をちょきちょきと切る...

これが役に立てば幸いです。もう一度感謝します

4

1 に答える 1

1

はい、デフォルトのパラメーター宣言の例は有効で合法です。ここに簡単な再現があります:

USE tempdb;
GO
CREATE PROCEDURE dbo.splunge
   @GP nvarchar(1) = N'N'
AS
BEGIN
    SET NOCOUNT ON;

    SELECT COALESCE(@GP, N'Y');
END
GO

EXEC dbo.splunge;
EXEC dbo.splunge @GP = N'Y';

結果:

----
N

----
Y

これを機能させるのに問題がある場合は、それが何を意味するのかを示すために、さらに多くのコードを投稿する必要があります。

于 2012-06-26T02:00:37.340 に答える