2

我想創建一個具有可選參數的存儲過程。我遵循列出的說明here。我也參考了SO question。不過,我不斷收到以下錯誤:SQL存儲過程中的可選參數

Error converting data type varchar to int.

它的工作原理,當我執行它

EXEC sp_get_user {id#} 

EXEC sp_get_user NULL, {username} 

但失敗

EXEC sp_get_user {username} 

存儲過程

@id int = NULL, 
@username nvarchar(50) = NULL 

SELECT 
    username = COALESCE(a.Username, b.Username), 
    password = COALESCE(a.Password, b.Password), 
    signup_date = COALESCE(a.SignedUpOn, b.Signup_Date) 
FROM table1 a 
FULL OUTER JOIN table 2 b 
ON a.ID = b.ID 
WHERE ((a.ID = @id OR @id IS NULL) 
AND (a.Username = @username OR @username IS NULL) 
OR (b.ID = @id OR @id IS NULL) 
AND (b.Username = @username OR @username IS NULL)) 

我曾嘗試加入OPTION(RECOMPILE)並沒有成功。我希望使這種動態變化,以便其他開發人員可以調用此SP,而無需每次指定所有參數。如果有所不同,他們將通過LINQ連接。在這種情況下

+0

通過google找到的舊問題 - 爲什麼將此標記爲LINQ? 「通過LINQ連接」是LINQ的唯一參考 – 2014-07-23 09:43:10

回答

5

命名參數

EXEC sp_get_user @username = {username} 

如果兩個參數都是可選的,SQL Server將通過位置去,所以要傳遞的第一個將映射到第一個在proc

3

嗯,是的,顯然你最後一次嘗試會失敗。

你的存儲過程需要兩個參數,按照這個順序:

  1. @id INT
  2. @username NVARCHAR(50)

如果你只是簡單地用一個參數調用存儲過程,則該參數會映射到@id - 因此它需要是INT

如果你想打電話給你的存儲過程與用戶名只是一個單一的值,則需要使用命名參數 - 你不能靠上的位置(因爲第一個也是唯一一個參數將始終匹配@id

EXEC sp_get_user @username = {username} 
4

當執行你必須分別定義爲符合該參數順序存儲過程,這也就是爲什麼第一和第二語句工作正常,在第一個EXEC sp_get_user {id#}你傳遞的ID,而忽視了用戶名,那麼它將採用定義的默認值。此外,在你的第二個語句EXEC sp_get_user NULL, {username}中,你爲id指定了NULL,並且你爲username參數傳遞了一個值,這也是它的原因。

在另一方面,第三個EXEC sp_get_user {username}不起作用,因爲SQL Server處理您的參數{username}作爲id的值,這就是爲什麼它試圖將其轉換爲整數,當然它會失敗。相反,您必須在傳遞其值時指定參數名稱,請參閱以下代碼:

EXEC sp_get_user @username = {username}