2013-12-19 106 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这些值。

相关问题