SQL Server中具有单个参数的多值存储过程

时间:2014-04-05 10:52:29

标签: sql-server-2008 stored-procedures

我在C#中有一个带有列表框的表单,我在其中选择了4个项目。现在我想创建单个存储过程,使用该存储过程,我可以使用单个参数从单个表中查找所有此选定项目的数据。

由于我是SQL Server的初学者,我完全不了解这种类型的过程 谢谢,但这不是我的问题的答案 我想为ListBox中选择的所有项目提供单个存储过程

Create Procedure procedureName
(
 @ItemName varchar(50),
)
AS
BEGIN
(
Select * from item_master where item_name = @ItemName
)
END

通过此查询我可以找到一个ItemName的数据,但我想要列表框中的所有选定项目,即使我也不知道C#代码, 所以PLZ帮助我......

1 个答案:

答案 0 :(得分:2)

这是一个非常简单的例子,可以满足您的需求。您不希望使用硬编码的连接字符串,特别是在线,并且您需要错误处理,但我希望尽可能清晰。您可能还希望使列长度大于50个字符,但我使其与列定义匹配。

此外,我建议使用通用方法,传递密钥(列名称)和值,以便能够将其用于任何类型的标准,但是您要求我将其保持为您所需要的,所以我把它修剪成必不可少的。

此示例返回所有与传递给存储过程的列表中的FirstName匹配的Employees(作为用户定义的表类型)。

首先,在SQL Server数据库中创建一个用户定义的表类型(以保存要传递给存储过程的值),如下所示:

CREATE TYPE [dbo].[FilterValues] AS TABLE(
    [Value] [varchar](50) NOT NULL,
    PRIMARY KEY CLUSTERED 
    (
        [Value] ASC
    )
)

返回Employees的存储过程如下所示(请注意,它具有用户定义的表类型作为传入的单个参数的类型):

CREATE PROCEDURE [dbo].[GetEmployees] (
    @FirstNameFilterValues dbo.FilterValues READONLY
)
AS
BEGIN
    SELECT * FROM Employees 
    INNER JOIN @FirstNameFilterValues fv ON fv.Value = Employees.FirstName; 
END

这就是SQL Server方面做的。要从C#调用它,您可以使用与列名匹配的单个列创建DataTable,并使用所需的值填充它。在这个简单的例子中,我用两个名字填充它,但它可以是你想要的多少。

var filterValuesDataTable = new DataTable();
filterValuesDataTable.Columns.Add(new DataColumn("Value", typeof(string)) { AllowDBNull = false });
filterValuesDataTable.Rows.Add("Frodo");
filterValuesDataTable.Rows.Add("Sam");

using (var connection = new SqlConnection("server=.;Initial Catalog=Test;Integrated Security=True;"))
{
    connection.Open();
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "GetEmployees";
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.AddWithValue("@FirstNameFilterValues", filterValuesDataTable);
        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                Console.WriteLine("{0} {1}", reader["FirstName"], reader["LastName"]);
            }
            reader.Close();
        }                    
    }
    connection.Close();
}