2013-12-19 108 views
0

我有一個存儲過程,需要在SQL Server 2012中傳遞多個參數。我的應用程序將爲所有員工或特定員工構建一個報告。如果用戶想要選擇某些員工而不是全部員工,我有一個員工覈對清單框。我想在存儲過程的where子句中使用那些選定的員工。我讀過SQL Server 2012,你可以將一個表作爲參數傳遞給多個值。我似乎無法找到一個適合我的情況的好例子。任何幫助將不勝感激。將多個參數傳遞到SQL Server存儲過程

+1

請參閱:[Sql參數](http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v = vs.110).aspx)。 – Brian

回答

2

假設你傳遞了EmployeeIDs,它們是整數。首先,在數據庫中創建一個表類型:

CREATE TYPE dbo.EmployeesTVP AS TABLE(EmployeeID INT PRIMARY KEY); 

現在你的存儲過程可以說:

CREATE PROCEDURE dbo.GetEmployees 
    @empTVP dbo.EmployeesTVP READONLY 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT EmployeeID, Name FROM dbo.Employees AS e 
    WHERE EXISTS (SELECT 1 FROM @empTVP WHERE EmployeeID = e.EmployeeID); 
END 
GO 

如果你要處理的所有情況下,你可以說:

IF EXISTS (SELECT 1 FROM @empTVP) 

    SELECT EmployeeID, Name FROM dbo.Employees AS e 
    WHERE EXISTS (SELECT 1 FROM @empTVP WHERE EmployeeID = e.EmployeeID); 

ELSE 

    SELECT EmployeeID, Name FROM dbo.Employees; 

(您可以將這些條件與OR條件相結合,但我傾向於認爲這只是優化程序的適合。)

然後,在複選框的C#代碼中創建一個DataTable,並將該參數作爲Structured的參數類型傳遞給存儲過程。您可以填寫其餘但是:

DataTable tvp = new DataTable(); 

// define/populate DataTable from checkboxes 

using (connectionObject) 
{ 
    SqlCommand cmd = new SqlCommand("dbo.GetEmployees", connectionObject); 
    cmd.CommandType = CommandType.StoredProcedure; 
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@empTVP", tvp); 
    tvparam.SqlDbType = SqlDbType.Structured; 
    // ... execute the cmd, grab a reader, etc. 
} 
+0

+1:漂亮的解決方案 –

+0

即將關閉。我將不得不在我的存儲過程中執行此操作: 其中empName類似於「參數」 或empName類似於「parameter1」 – grath

+0

@grath好吧,相同的概念,你能適應它嗎?你的問題聽起來像是你要麼傳遞一個或多個員工ID,要麼沒有。 –

0

補充到亞倫響應:

1 /發送打包爲XML數據,並使用XML數據類型的參數

2 /將您的員工ID值加入單個字符串,逗號分隔,然後split這些值。

相關問題