SQL 查询 - 从项目/元组列表中选择

标签 sql sql-server sql-server-2008 tsql

我有一个从 Web 服务调用中检索到的对象列表,我需要将它们与我的一个数据库表中的某些行进行匹配。我的对象有几个属性:

Name - string
Type - string

名称和类型一起会在我的数据库中带回一个唯一的项目:

SELECT * FROM dbo.MyTable WHERE SomeName = @Name AND SomeType = @Type

这很好用;但是,我有一个名称/类型对列表,需要与我的数据库中的行进行匹配:

List<Tuple> values = [{ "Name1", "Type1" }, { "Name2", "Type2" }, { "Name3", "Type3" }]

我如何在 SQL 中编写查询,以返回基于元组列表的项目列表。上面的格式实际上不是我的值的格式,所以不用担心编写一些解析逻辑来获取值。

最佳答案

你可以使用 Table-Valued Parameters in SQL Server 2008 (ADO.NET) .

SQL

CREATE TYPE [dbo].[MyTableType] AS TABLE
(
    [SomeName] NVARCHAR(50),
    [SomeType] NVARCHAR(50)
)

CREATE TABLE [dbo].[MyTable]
(
    [SomeName] NVARCHAR(50),
    [SomeType] NVARCHAR(50)
)

INSERT  [dbo].[MyTable]
VALUES  ('Name1', 'Type1'),
        ('Name2', 'Type2'),
        ('Name3', 'Type3'),
        ('Name4', 'Type4')

C#

var values = new List<Tuple<string, string>> { Tuple.Create("Name1", "Type1"), Tuple.Create("Name2", "Type2"), Tuple.Create("Name3", "Type3") };

var dataTable = new DataTable();
dataTable.Columns.Add(new DataColumn("SomeName", typeof(string)));
dataTable.Columns.Add(new DataColumn("SomeType", typeof(string)));

values.ForEach(v => dataTable.Rows.Add(v.Item1, v.Item2));

using (var connection = new SqlConnection(@"Data Source=.;Initial Catalog=Tom;Integrated Security=True"))
{
    using (var command = new SqlCommand())
    {
        command.Connection = connection;
        command.CommandText =
            "SELECT * " +
            "FROM [dbo].[MyTable] mt " +
            "INNER JOIN @MyTableType mtt " +
            "   ON mt.[SomeName] = mtt.[SomeName] " +
            "   AND mt.[SomeType] = mtt.[SomeType]";

        SqlParameter parameter = command.Parameters.AddWithValue("@MyTableType", dataTable);
        parameter.SqlDbType = SqlDbType.Structured;
        parameter.TypeName = "[dbo].[MyTableType]";

        connection.Open();
        SqlDataReader reader = command.ExecuteReader();

        while (reader.Read())
        {
            Console.WriteLine("mt.[SomeName]: {0}, mt.[SomeType]: {1}, mtt.[SomeName]: {2}, mtt.[SomeType]: {3}", 
                reader.GetString(0), reader.GetString(1), reader.GetString(2), reader.GetString(3));
        }
    }
}

Console.ReadKey();

关于SQL 查询 - 从项目/元组列表中选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8052697/

相关文章:

sql-server - LightSwitch相关数据请求优化

vb.net - 为什么我可以通过odbc连接到sql server 2008,但不能通过vb.net代码连接到sql server 2008?

sql - 将日期与雪花中单列中的其他日期进行比较

mysql - SQL 查询未获得包含多个 AND 的结果

c# - 如何列出安装在本地计算机上的 SQL Server 实例? (仅限本地)

c# - 指定 CLR 存储过程的 SqlString 长度

sql-server - 表使用太多磁盘空间

sql - 在日期时间间隔内展开表格

MySQL查询以选择至少包含一定数量元素的组

Mysql dump 命令与 MS SQL Server 类似