代码之家  ›  专栏  ›  技术社区  ›  Santosh Chandavaram

T-SQL查询中的多值参数

  •  1
  • Santosh Chandavaram  · 技术社区  · 17 年前

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

    我有以下查询参数。

            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
    

    4 回复  |  直到 17 年前
        1
  •  2
  •   Remus Rusanu    17 年前

    对于SQL 2008,您应该按照Marc的建议使用TVP。

    http://www.sommarskog.se/arrays-in-sql-2005.html .

    对于SQL 2000,选项更少,而且Erland在下面对每个选项进行了全面的讨论 Arrays and Lists in SQL Server (SQL 2000 and Earlier)

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

        2
  •  1
  •   Gratzy    17 年前

            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转换成一个字符串并执行它。

        3
  •  0
  •   Cᴏʀʏ bcherry    17 年前

    如果要向存储过程传递字符串数组并执行T-SQL“in”操作,可能需要在存储过程中做更多的工作。

    This article 有一个很好的例子。

        4
  •  0
  •   marc_s MisterSmith    17 年前

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

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

    CREATE Procedure AddCustomers(@customer Customer READONLY)
    

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

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

    马克