我正在使用.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个参数)。
有关于此的任何想法吗?
答案 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
变量,并将其用作输入参数。这样,您可以传入任意数量的值以及您喜欢的任何结构。
有关更多信息和广泛的代码示例,请参阅这些优秀博客文章:
马克