【问题标题】:How to get a single column's value from a stored procedure call within a stored procedure?如何从存储过程中的存储过程调用中获取单个列的值?
【发布时间】: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 分配一个值,使其包含ErrorCode0?如果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


【解决方案1】:

SP_Validate_User 存储过程是一个分为两部分的一个,一个返回错误代码的语句,一个拉回用户的语句,对吗?

如果发生这种情况,为什么不将 IP 参数添加到 SP_Validate_User proc,然后在该 proc 中有两个插入语句,一个在满足错误条件时插入,另一个在错误条件时插入不满足。

INSERT INTO LoginAudit (IP, Username, Password, AttemptDate, Result)
VALUES (@IP, @UserName, @Password, GETDATE(), someNumber)

SELECT 
someNumber AS ErrorCode, 
otherNumber AS AttemptsRemaining, 
thirdNumber AS LockoutTimeRemaining

RETURN

INSERT INTO LoginAudit (IP, Username, Password, AttemptDate, Result)
VALUES (@IP, @UserName, @Password, GETDATE(), 0)

SELECT * 
FROM Users 
WHERE ...

RETURN

【讨论】:

  • 这可能是最简单的。 Validate _ User _ Main 实际上根据一些事情调用多个子 SP 之一,所以我想将它添加到那里以减少子 SP 之间的冗余,但我晚上必须...
  • 我明白你的意思。您可以在 SELECT * FROM Users WHERE ... 查询中添加一个虚拟列,因此它类似于 SELECT 0 as ErrorCode, * from Users WHERE ... 然后您始终可以将 ErrorCode 值分配给 @Result
猜你喜欢
  • 2017-01-01
  • 2011-04-26
  • 2014-04-21
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2017-02-14
  • 2019-08-01
  • 1970-01-01
相关资源
最近更新 更多