SQL 选择列表中的值<string>

问题描述 投票:0回答:9

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

示例:

Select * from Table where RecordID in (RecordIDList)

我已经看到了一些使用 Linq 实现此目的的方法,但如果可以避免的话,我宁愿不使用它。

.net sql ado.net
9个回答
20
投票

我只做了你试图用逗号分隔列表做的事情

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)

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


13
投票

您可以使用

String.Join
。尝试这样的事情:

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

顺便说明一下,这不会保护您免受 SQL 注入 - 希望这个示例能为您指明正确的方向。


9
投票

Linq 到 Sql。 RecordList 应该是

List<T>
,而不是
ArrayList
IList<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 个元素的列表。


4
投票

您可以迭代数组并为每个数组添加一个参数到 SQL。这可以帮助您解决 SQL 注入问题,但请确保在构建 SQL 语句时使用 StringBuilder 而不是字符串连接。

例如

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

1
投票

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

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

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

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


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

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

可与 List<> 和 ArrayList 一起使用,因为它们都实现 IEnumerable。

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


0
投票
如果使用动态 SQL,则可以将括号的内容作为逗号分隔的文字列表发送。否则,您可以使用 XML 变量来发送多个值。请参阅

http://vyaskn.tripod.com/passing_arrays_to_stored_procedures.htm


0
投票
您可以使用示例颜色字符串列表来执行此操作,以逗号分隔:

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

-4
投票
请注意 Linq to SQL = 已死,来源:

http://blogs.msdn.com/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-路线图.aspx

如果你想实现这样的架构,目前应该使用实体框架。

此外,如果您对“in”子句使用另一个选择查询(如 GordonB 建议的那样),则最好使用“exists”而不是“in”,例如:

select * from tablename where exists (select id from othertablename where fieldtype=1)
    
© www.soinside.com 2019 - 2024. All rights reserved.