Как обновить несколько строк одним запросом MS SQL?

Есть таблица с двумя строчками:

Я могу обновить данные в одной строке следующим образом:

string sqlExpression = String.Format(
                    "UPDATE Markers SET Lat = '{0}', Lng = '{1}' WHERE id = {2}", strMarkerGLat, strMarkerGLng, id);

Подскажите, как обновить несколько строк одним запросом MS SQL?


Ответы (1 шт):

Автор решения: koshe

Можно создать xml с данными и передать как параметр, например:

var tbl = new DataTable("tbl");
tbl.Columns.Add("id", typeof(int));
tbl.Columns.Add("Lat", typeof(float));
tbl.Columns.Add("Lng", typeof(float));
tbl.Rows.Add(1, 55.75393, 37.620795);
tbl.Rows.Add(2, 55.76391, 37.640763);
tbl.Rows.Add(5, 55.76293, 37.611632);
var ds = new DataSet("ds");
ds.Tables.Add(tbl);
var data = ds.GetXml();

using (var conn = new System.Data.SqlClient.SqlConnection(connectionString))
{
    conn.Open();
    using (var cmd = conn.CreateCommand())
    {
        cmd.CommandText =
            @"WITH ct AS
            (
                SELECT T.c.value('id[1]','int') as id,
                       T.c.value('Lat[1]','float') as Lat,
                       T.c.value('Lng[1]','float') as Lng
                FROM @x.nodes('/*/*') T(c)
            )
            UPDATE m
            SET Lat=ct.Lat, Lng=ct.Lng
            FROM Markers m INNER JOIN
                 ct ON ct.id=m.id"

        cmd.Parameters.Add("@x", SqlDbType.Xml).Value = data;
        var rdr = cmd.ExecuteNonQuery();
    }                
}
→ Ссылка