【发布时间】:2016-11-07 21:07:24
【问题描述】:
我有以下程序:
SP_Validate_User_Main
(
@UserName VARCHAR(20),
@Password VARCHAR(20),
@From VARCHAR(10),
@IP VARCHAR(15)
)
-- does a bunch of stuff, then the following line is the last to execute
EXECUTE SP_Validate_User @aUserName = @UserName, @aPassword = @Password
根据传递给SP_Validate_User 的数据的有效性,然后执行 2 个语句中的 1 个:
SELECT
someNumber AS ErrorCode,
otherNumber AS AttemptsRemaining,
thirdNumber AS LockoutTimeRemaining
RETURN
或
SELECT *
FROM Users
WHERE ...
RETURN
我正在尝试扩展我的第一个过程SP_Validate_User_Main,以便在每次用户尝试登录时将一条记录插入到一个新的审计表中,无论它是否成功。所以我将这两行添加到SP_Validate_User_Main:
INSERT INTO LoginAudit (IP, Username, Password, AttemptDate, Result)
VALUES (@IP, @UserName, @Password, GETDATE(), @Result)
如何为@Result 分配一个值,使其包含ErrorCode 或0?如果ErrorCode 存在于SP_Validate_User 返回的数据集中,我想要那个值。如果没有,我希望它包含值 0。
我发现了这个问题:
Select columns from result set of stored procedure
这似乎在问我想要什么,但没有公认的解决方案,并且投票最多的答案不适用,因为 SP_Validate_User 将返回 2 个模式中的 1 个。
我在搜索时发现的所有其他问题都是关于处理数据代码端而不是 DB。
基本上,我正在寻找这个伪代码的 SQL 等效项:
if (resultSet.Columns.Count > 3)
@Result = 0;
else
@Result = resultSet["ErrorCode"];
【问题讨论】:
-
旁注:您应该不为您的存储过程使用
sp_前缀。微软有reserved that prefix for its own use (see Naming Stored Procedures),你确实会在未来某个时候冒着名称冲突的风险。 It's also bad for your stored procedure performance。最好只是简单地避免sp_并使用其他东西作为前缀 - 或者根本不使用前缀! -
@marc_s 感谢您的提示。我们实际上称他们为
USP_whatever,但每当发布到 SO 时,我都会稍微更改一下名称。然而,我并没有意识到这一点。 -
您是否在寻找类似@@ERROR 或 ERROR_NUMBER() 的内容
标签: sql sql-server tsql stored-procedures sql-server-2012