【发布时间】:2012-06-26 01:50:09
【问题描述】:
我在 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,这对于我的应用程序来说是不可行的。
有人知道以上是否是合法的默认参数声明吗?
更新:
感谢 Aaron 的快速回复。我希望这将是一个简单的问题,因为代码很长。也就是说,这里是:
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;
...剪辑...
希望对您有所帮助,再次感谢
【问题讨论】:
-
您需要显示更多的代码,而不仅仅是参数定义(其余参数似乎与问题无关)。您可以发布一个重现问题的过程而不依赖其他参数或您的基础表结构吗?您没有提供足够的信息让其他人为您排查问题。
-
感谢您的反馈,亚伦。我在上面发布了更多代码。
-
仍然没有看到存储过程或某种关于出错原因的解释...
-
附带说明:
nvarchar(1)真的毫无意义。如果你的字符串只有最大值。 1 个字符长 - 请改用NCHAR(1)。对于可变长度字符串,不需要产生至少 2 个字节的开销。NCHAR(1)将始终占用 2 个字节的空间 -NVARCHAR(1)是 2-4 个字节,具体取决于字符串中是否存储了某些内容。长度为 5-10 或更短的字符串应该不使用(n)varchar数据类型 - 这样做真的没有任何好处。
标签: sql-server-2008 tsql stored-procedures optional-parameters