2016-11-07 82 views
1

我有以下步驟:如何從存儲過程中的存儲過程調用中獲取單個列的值?

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使得它將包含任何ErrorCode0?如果在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"]; 
+2

旁註:你應該** **不使用'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_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

@marc_s感謝您的提示。我們實際上稱他們爲'USP_whatever',但只要發佈到SO,我都會稍微改變一下名字。不過,我並沒有意識到這一點。 – sab669

+0

您是否在尋找類似@@ ERROR或ERROR_NUMBER() – scsimon

回答

2

的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 
+0

這可能是最簡單的。 'Validate _ User _ Main'實際上根據一些事情調用多個子SP中的一個,所以我想將它添加到那裏以減少跨子SP的冗餘,但是我必須...... – sab669

+0

我明白你的觀點。你也許可以在SELECT * FROM Users WHERE ...查詢中添加一個虛擬列,所以它的東西就像SELECT 0作爲ErrorCode,*來自用戶WHERE ...那麼你總是可以將ErrorCode的值賦給@Result – Pops

相關問題