SQL选择List <string> </string>中的值的位置

时间:2009-03-02 14:35:47

标签: .net sql ado.net

有没有办法可以针对具有指向ArrayList或List的where子句的数据源(可能是sql,oracle或access)创建查询?

示例:

Select * from Table where RecordID in (RecordIDList)

我已经看过Linq的一些方法,但如果可以避免的话,我宁愿不诉诸它。

9 个答案:

答案 0 :(得分:12)

您可以使用String.Join。尝试这样的事情:

String query = "select * from table where RecordId in ({0});";
String formatted = String.Format(query, String.Join(",", list.ToArray()));

作为旁注,这不会保护你免受SQL注入 - 希望这个例子能指出你正确的方向。

答案 1 :(得分:7)

Linq to Sql。 RecordList应该是List<T>,而不是ArrayListIList<T>

IEnumerable<TableRow> query =
  from t in db.Table
  where RecordList.Any(r => t.RecordId == r)
  select t;

这将生成带参数的SQL:

SELECT *
FROM Table
WHERE RecordId in (@p0, @p1, @p2, @p3, @p4)

Linq将生成所需数量的参数。某些数据库实现受限于可以接受的参数数量。 SqlServer2005的限制是超过2000个参数...所以不要使用超过2000个元素的列表。

答案 2 :(得分:6)

我只是用逗号分隔列表

完成了你想做的事情
Select * from Table where RecordID in (1,2,34,45,76,34,457,34)

或结果来自单独的选择

Select * from Table where RecordID in (select recordId from otherTable where afieldtype=1)

我很确定你无法实现你所追求的......

答案 3 :(得分:4)

您可以迭代数组并为每个数组添加一个参数。这可以帮助您了解SQL注入,但请确保在构建SQL语句时使用StringBuilder而不是strign concatenation。

e.g。

StringBuilder sql = new StrignBuilder("select * from Table where ");
for  (int i = 0; i < RecordIDLis.Length; i++)
{
    if (i > 0) sql.Append (" OR ");
    sql.Append(" RecordID = @param" + i.ToString() + " ");
    IDbDataParameter param = new Param();
    param.value etc.
}

答案 4 :(得分:1)

您可以编写一个表值用户定义函数,该函数获取ID列表并创建表,然后再次连接此函数的结果。这个article by Erland Sommarskog描述了如何做到这一点。

或者,您可以使用SQL Server 2008中的新表参数(我认为)。

或者,正如Manu所说,你可以使用XML。

但是,我建议不要在接受的答案中使用IN String.Join方法,因为它就像要求SQL注入一样。

答案 5 :(得分:0)

如果使用动态SQL,则可以将括号内容作为以逗号分隔的文字列表发送。否则,您可以使用XML变量来发送多个值。见http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm

答案 6 :(得分:0)

使用Linq to SQL,我假设实体框架,您可以执行以下操作:

dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));

将同时使用List&lt;&gt;和ArrayList一样,它们都实现了IEnumerable。

Linq和Lambdas要求您反转Contains方法,但它确实有效并生成SQL“IN()”子句。

答案 7 :(得分:0)

您可以使用以逗号分隔的示例字符串列表来执行此操作:

SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''

答案 8 :(得分:-4)

请注意Linq to SQL = dead,来源:http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx

如果要实现此类架构,实体框架是您当前应该使用的。

此外,如果您使用其他选择查询(如GordonB建议)作为“in”子句,最好使用“exists”而不是“in”,例如:

select * from tablename where exists (select id from othertablename where fieldtype=1)