.net SQL选择列表中值的位置<;字符串>;

.net SQL选择列表中值的位置<;字符串>;,.net,sql,ado.net,.net,Sql,Ado.net,是否有一种方法可以针对具有指向ArrayList或List的where子句的数据源(可以是sql、oracle或access)创建查询 例如: Select * from Table where RecordID in (RecordIDList) 我已经看到了一些使用Linq的方法,但是如果可以避免的话,我不想使用它。您可以使用String.Join。试着这样做: String query = "select * from table where RecordId in ({0});"; S

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

例如:

Select * from Table where RecordID in (RecordIDList)

我已经看到了一些使用Linq的方法,但是如果可以避免的话,我不想使用它。

您可以使用
String.Join
。试着这样做:

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

作为旁注,这不会保护您免受SQL注入的影响-希望本示例将为您指明正确的方向。

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

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

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)

我很确定您无法实现您所追求的目标….

Linq to Sql。记录列表应该是
列表
,而不是
数组列表
列表列表


Linq将根据需要生成尽可能多的参数。一些数据库实现在可接受的参数数量上受到限制。SqlServer2005的限制是略多于2000个参数。。。因此,不要使用包含超过2000个元素的列表。

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

dataContext.Table.Where(t => RecordIDList.Contains(t.RecordID));
将使用List和ArrayList,因为它们都实现IEnumerable


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

请注意Linq to SQL=dead,来源:

实体框架是您当前应该使用的,如果您想要实现这样的体系结构

此外,如果您正在为“in”子句使用另一个select查询(如GordonB建议),则最好使用“exists”而不是“in”,例如:

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

您可以编写一个表值用户定义函数,该函数接受ID列表并创建一个表,然后重新连接该函数的结果。这描述了如何做

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

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


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

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

e、 g

StringBuilderSQL=newStringBuilder(“从表中选择*);
for(int i=0;i0)sql.Append(“或”);
Append(“RecordID=@param”+i.ToString()+”;
IDbDataParameter param=新参数();
参数值等。
}

您可以使用一个颜色字符串列表的示例,用逗号分隔:

SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''
选择值
来自字符串_SPLIT('红色、绿色、蓝色'、'、')
其中修剪(值)'

string.Join的签名实际上是(string,string[]),因此调用看起来更像string.Join(“,”,list.ToArray())。我要比您的语句“不会保护您免受SQL注入”更进一步,并说这些东西是所有SQL注入之母。当然,在一般情况下,通过字符串连接构建SQL查询是一个坏主意,但是如果记录ID列表是一个强类型的整数列表,这种方法的SQL注入风险为零。JoelHess没有询问LinqToSql。。。这个问题包括Oracle,因此LinqToSql应该被该要求排除在外。
select * from tablename where exists (select id from othertablename where fieldtype=1)
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.
}
SELECT value
FROM STRING_SPLIT('red,green,blue', ',')
WHERE TRIM(value) <> ''