如何将datatable用作SQL Server临时表?

时间:2017-01-05 10:26:22

标签: c# sql-server datatable

我有一个SQL Update查询和一个C#的DataTable。我想将此DataTable用作SQL Server的TempTable。查询将在C#端执行(通过ADO.NET)

请检查下面的C#代码 -

1)C#DataTable:

DataTable dt  = new DataTable();

2)更新查询:

using (var cmd = cn.CreateCommand())
{

  cmd.CommandText = "UPDATE p
                     SET p.Name = t.Name, p.Type = t.Type
                     FROM Product AS p
                     INNER JOIN dt AS t ON p.id = t.id"


cmd.ExecuteNonQuery();

}

在我的情况下,我无法使用SQL存储过程。

2 个答案:

答案 0 :(得分:1)

foreach(DataRow dr in dt.Rows)
{
cmd.CommandText = "UPDATE Product
                     SET Name = @name, Type = @type
                   WHERE id = @id";
cmd.Parameters.Clear();
cmd.Parameters.AddWithValue("@name", dr["Name"].ToString());
cmd.Parameters.AddWithValue("@type", dr["Type"].ToString());
cmd.Parameters.AddWithValue("@id", dr["id"].ToString());


cmd.ExecuteNonQuery();
}

除非在SQL Server中创建了与临时表匹配的新表类型,否则不能在SQL Server的内存表中使用。这是一个开销。相反,您可以使用foreach。您可以使用id表格逐个更新每个dt

使用动态sql的替代方式:

cmd.CommandText = string.Empty;
foreach(DataRow dr in dt.Rows)
{
cmd.CommandText += string.Format(@"UPDATE Product
                     SET Name = '{0}', Type = '{1}'
                   WHERE id = '{2}';",dr["Name"].ToString(),dr["Type"].ToString(),dr["id"].ToString()) ;
}

cmd.ExecuteNonQuery();

答案 1 :(得分:0)

我不确定这是否可行,但我想出了一个尝试声明一个表变量,向其插入值,然后更新目标表,所有这些都在内联查询中:

var sb = new StringBuilder("DECLARE @T as Table (Id int, Name varchar(20), Type int ); ");

sb.Append("INSERT INTO @T VALUES ");
foreach (DataRow row in dt.Rows)
{
    sb.Append("(").Append(row["Id"]).Append(", '");
    sb.Append(row["Name"]).Append("', '");
    sb.Append(row["Type"]).Append("'),");
}
sb.Remove(sb.Length - 1, 1);

sb.Append(";UPDATE p ");
sb.Append("SET p.Name = t.Name, ");
sb.Append("p.Type = t.Type ");
sb.Append("FROM Product AS p ");
sb.Append("INNER JOIN @T AS t ON p.id = t.id");

var query = sb.ToString();