如何选择SQL表的特定行而不在.net中循环

时间:2011-04-27 21:00:36

标签: sql arrays select parameters

假设我有一个名为“Names”的表

ID | Name
---+--------------
1  | Bob
2  | Billy
3  | James
4  | John
5  | Tom
and on and on with thousands of names...

假设我编写了以下.net代码来检索名称:

   public DataSet selectFromNames()
    {
        const string SQL_STATEMENT =
        @"SELECT Id, Name From Names;";

        Database db = EnterpriseLibraryContainer.Current.GetInstance<Database>("MyConnection");

        DbCommand command = db.GetSqlStringCommand(SQL_STATEMENT);
        command.CommandType = CommandType.Text;
        command.CommandText = SQL_STATEMENT;

        DataSet ds = db.ExecuteDataSet(command);
        return ds;
    }

工作正常。如果我想要一个具有整数数组参数的函数,该参数指定了我想要检索的名称的行,该怎么办?我该如何撰写该查询?

我熟悉将参数传递为@parameter,但我不知道如何使用字符串构建器传入一个数组来编写像where ID in (1,2,3)这样丑陋且容易出错的内容。

2 个答案:

答案 0 :(得分:0)

建议使用SQL Server UDF来帮助您。这是一个article explaining how to implement this

基本上你要创建一个UDF来将varchar()拆分成表变量。我们称之为dbo.MySplit()

然后你可以:

string sql = "SELECT * FROM Table WHERE ID IN (SELECT Item FROM dbo.MySplitUDF(@csv));";
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("@csv", string.Join(",",myIntegerArray);

答案 1 :(得分:0)

这个怎么样(使用LINQtoSQL)?

//...  
int[] idList = new int[] { 1, 2, 3, 4 };
var myNames = from n in db.Names
              where idList.Contains(n.ID)
              select n;

(取自Creating IN Queries With Linq To SQL