-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 回答