0

在 TSQL 中,我可以写:

Select * from mytablename  M where M.field in (1, 5, 8, 56)

如果我想在参数化 c# 中做同样的事情,语法是什么?

4

1 回答 1

1

SQL Server 2008 有一个称为表值参数的功能。您在 SQL Server 中创建一个“特殊类型”,然后您可以将 aDataTable作为参数传递,其中包含您想要的所有值。

你可以这样使用它:

在数据库上这样做:CREATE TYPE dbo.IntArray AS TABLE (Value INT NOT NULL)

您的 IN 查询必须更改为:CustomerID IN (SELECT Value FROM @1)

// Your array of IDs
int[] ids = new[] { 1, 2, 3, 4, 5, 6, 7, 10 };

using (var connection = new SqlConnection("Initial Catalog=AdventureWorksLT2012;Integrated Security=True"))
{
    connection.Open();

    using (var command = new SqlCommand("SELECT CustomerID FROM SalesLT.Customer WHERE CustomerID IN (SELECT Value FROM @1)", connection))
    {
        // An untyped Datatable
        var dt = new DataTable();

        // With a single column
        dt.Columns.Add();

        // Copy your IDs in the DataTable
        foreach (var v in ids)
        {
            dt.Rows.Add(v);
        }

        // Create the Table-Valued Parameter
        var param = command.Parameters.AddWithValue("@1", dt);
        param.SqlDbType = SqlDbType.Structured;
        param.TypeName = "dbo.IntArray";

        using (var reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                int id = (int)reader[0];

                Console.WriteLine(id);
            }
        }
    }
}

从技术上讲,您甚至可以更改查询,例如

INNER JOIN @1 Par ON CustomerID = Par.Value

这样做的好处是您可以创建一个多列DataTable和表值参数并同时搜索多个条件。

(请注意,我的代码过长,因为它是基于 Microsoft 的 AdventureWorks db 的工作示例)

于 2013-08-16T14:02:14.240 回答