代码之家  ›  专栏  ›  技术社区  ›  yaba

将集合作为SQL参数添加到SqlCommand,而不使用(表值参数)类型

  •  0
  • yaba  · 技术社区  · 6 年前

    在MSSQL中,我可以执行以下操作:

    declare @mytable table (column1 int, column2 nvarchar(10))
    insert into @mytable select 1, "test" UNION ALL select 2, "test2" UNION ALL [...]
    
    select * from sometable inner join @mytable on sometable.id = @mytable.column1
    

    要在C#中实现这一点,我可以(大致)执行以下操作:

    SqlCommand cmd ...
    var p = cmd.CreateParameter();
    p.TypeName = "MyType";                  // <-- I dont't want to do this
    p.SqlDbType = SqlDbType.Structured;
    p.Value = myDataTable;
    p.ParameterName = "table";
    cmd.Parameters.Add(p);
    cmd.CommandText = "select * from sometable inner join @mytable on ... ";
    

    要使其工作,我必须在数据库中创建类型“MyType”: CREATE TYPE [MyType] AS TABLE (...);

    是否有任何方法可以将集合作为参数添加到SQL命令中,而无需在数据库中声明其类型并使用该类型作为参数的类型名?

    1 回复  |  直到 6 年前
        1
  •  0
  •   yaba    6 年前

    我最终使用了Json(正如@DanGuzman所建议的),并对其进行了测试,在一个包含大约500个项目的相对简单的数据集(我的用例)中,它表现得非常好。

    C#中的简单实现示例:

    var col = new object[] { new { Column1 = "Test", Column2 = 1 }, new { Column1 = "2nd row", Column2 = 2 }, ... };
    IDbDataParameter p = command.CreateParameter();
    p.DbType = DbType.String;
    p.ParameterName = "mytable";
    p.Value = JsonConvert.SerializeObject(col); // NewtonSoft 
    command.Parameters.Add(p);
    command.CommandText = "SELECT * FROM OPENJSON(@mytable) WITH (Column1 nvarchar(max), Column2 int)";
    

    工具书类