我有以下步驟:如何從存儲過程中的存儲過程調用中獲取單個列的值?
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
,以便在每次用戶att時將記錄插入新的審計表無論它是否成功,都會登錄。所以,我已經添加了這些2線SP_Validate_User_Main
:
INSERT INTO LoginAudit (IP, Username, Password, AttemptDate, Result)
VALUES (@IP, @UserName, @Password, GETDATE(), @Result)
我如何分配一個值@Result
使得它將包含任何ErrorCode
或0
?如果在SP_Validate_User
返回的數據集中存在ErrorCode
,我需要該值。如果沒有,我希望它包含值0
。
我發現這太問題:
Select columns from result set of stored procedure
這似乎是問我想要什麼,但沒有接受的解決方案和得票最多的答案是不適用的SP_Validate_User
將返回2種模式的1。
我在搜索時發現的所有其他問題都是關於處理數據代碼端而不是數據庫。
基本上,我正在尋找SQL相當於這個僞代碼:
if (resultSet.Columns.Count > 3)
@Result = 0;
else
@Result = resultSet["ErrorCode"];
旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –
@marc_s感謝您的提示。我們實際上稱他們爲'USP_whatever',但只要發佈到SO,我都會稍微改變一下名字。不過,我並沒有意識到這一點。 – sab669
您是否在尋找類似@@ ERROR或ERROR_NUMBER() – scsimon