T-SQL查询中的多值参数

时间:2009-08-28 16:16:02

标签: asp.net sql sql-server tsql

我正在使用.aspx页面,该页面使用t-sql查询,该查询使用多值输入参数(一组labnames),使用一个数组在运行查询之前存储所有实验室名称。

我有查询的以下参数。

        With c.Parameters
        .Add(New SqlParameter("@sdate", sdate.text))
        .Add(New SqlParameter("@edate", edate.text))
        .Add(New SqlParameter("@labname", SqlDbType.Text)).Value = labnamesparam.ToString
    End With

但是,我仍然只看到一个labname(顺序中的第3个参数)。

有关于此的任何想法吗?

4 个答案:

答案 0 :(得分:2)

对于SQL 2008,您应该按照Marc。

的建议使用TVP

对于SQL 2005,有几种技术可以使用XML或使用逗号分隔列表。 Erland Sommarskog在http://www.sommarskog.se/arrays-in-sql-2005.html的hi页面上对每种技术进行了全面的分析。

对于SQL 2000,选项较少,Erland再次对Arrays and Lists in SQL Server (SQL 2000 and Earlier)处的每个选项进行了全面讨论。

我强烈推荐Erland的文章,他们多年来一直是这个主题的参考。

答案 1 :(得分:1)

您需要将数组的竞赛变成字符串。这是一个c#示例,当然不是唯一的方法。

        System.Text.StringBuilder k = new System.Text.StringBuilder();
        foreach (string x in LABNAMES) {
            k.Append(x);
            k.Append(",");
        }
        .Add(New SqlParameter("@labname", SqlDbType.Text)).Value =k.ToString();

你不得不改变你的sql虽然你不能有这样的动态in子句。老技巧但不是很好的做法是将整个sql变成一个字符串并执行一个。

答案 2 :(得分:0)

如果要将字符串数组传递给它并执行T-SQL“IN”操作,则可能需要在存储过程中多做一些工作。

This article有一个非常好的例子。

答案 3 :(得分:0)

如果您使用SQL Server 2008,则可以使用“表值参数”(TVP)功能。

基本上,在SQL Server 2008中,您需要定义用户定义的表类型:

CREATE TYPE Customer AS 
    TABLE (id int, CustomerName nvarchar(50), postcode nvarchar(50))

然后在存储过程中将其用作参数:

CREATE Procedure AddCustomers(@customer Customer READONLY)

然后在您的C#代码中,您将创建一个具有相同结构的DataTable变量,并将其用作输入参数。这样,您可以传入任意数量的值以及您喜欢的任何结构。

有关更多信息和广泛的代码示例,请参阅这些优秀博客文章:

马克