我在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'。但是,当我明确传入N'N'以获取@GP时,该过程仅返回预期的结果。
我尝试使用默认参数值搜索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;
...略...
希望这有用,再次感谢
答案 0 :(得分: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
如果您在解决此问题时遇到问题,则需要发布更多代码以证明这意味着什么。