在单个查询中更新表中的多个值

时间:2016-06-29 13:11:25

标签: c# sql-server

我有一张桌子说'Table1',如下所示

  Table1
  ---------------
  Name  | Value
  ----------------
  name1 | val1

  name2 | val2

  name3 | val3

  name4 | val4

这里我需要根据'名字'

更新'值'字段

我使用下面的存储过程来执行此操作,

CREATE PROCEDURE [dbo].[UpdateDetails] 
(
    @name1 NVARCHAR(MAX) = NULL,
    @name2 NVARCHAR(MAX) = NULL,
    @name3 NVARCHAR(MAX) = NULL,
    @name4 NVARCHAR(MAX) = NULL,
)
AS
BEGIN
    UPDATE Table1 SET Value = @name1 WHERE Name = 'name1';
    UPDATE Table1 SET Value = @name2 WHERE Name = 'name2';
    UPDATE Table1 SET Value = @name3 WHERE Name = 'name3';
    UPDATE Table1 SET Value = @name4 WHERE Name = 'name4';
END

更新此表的最佳方法是什么?

4 个答案:

答案 0 :(得分:2)

您可以使用CASE语句。我建议你在底部添加一个ELSE语句。底部将进行过滤,因此您只更新要搜索的行。

UPDATE Table1 SET Value = 
                     CASE WHEN Name = 'name1' THEN @name1 
                          WHEN Name = 'name2' THEN @name2 
                          WHEN Name = 'name3' THEN @name3 
                          WHEN Name = 'name4' THEN @name4 
                          ELSE Value
                     END
 WHERE Name in ('name1','name2','name3','name4')

答案 1 :(得分:2)

试试这段代码:

UPDATE Table1 
SET Value = CASE Name WHEN 'name1' THEN @name1
                      WHEN 'name2' THEN @name2
                      WHEN 'name3' THEN @name3
                      WHEN 'name4' THEN @name4                    
            END
WHERE Name in ('name1', 'name2', 'name3', 'name4');

答案 2 :(得分:0)

你没有明确这么说,但通常当你这样做时,你不知道在编码时你的表中有多少行,也不知道你想在任何特定时刻更新多少行。解决这个问题的最快方法是将循环放在C#中。你需要两个参数,@ name和@value,你将在循环外创建,然后你只需要为循环的每次迭代更改它们的值。所以你的代码看起来像......

Dictionary<string, string> myUpdates = new Dictionary<string, string>();
myUpdates.Add("name1", "value1");
myUpdates.Add("name2", "value2");
myUpdates.Add("name3", "value3");
myUpdates.Add("name4", "value4");

using (SqlConnection connection = new SqlConnection(connectionString))
{
    SqlCommand command = new SqlCommand("UPDATE Table1 set value = @value where name = @name", connection);
    var nameParam = new SqlParameter("name", System.Data.SqlDbType.NVarChar);
    var valueParam = new SqlParameter("value", System.Data.SqlDbType.NVarChar);
    command.Parameters.Add(nameParam);
    command.Parameters.Add(valueParam);
    connection.Open();
    foreach (var item in myUpdates)
    {
        try
        {
            nameParam.Value = item.Key;
            valueParam.Value = item.Value;
            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
}

“name”和“value”令人担忧地是DB列的抽象名称。通常,您的数据库列名称应该与“真实世界”更紧密地联系在一起。他们可能只是一些例子?

答案 3 :(得分:-1)

您可以使用动态SQL查询。像下面的东西。 我会像传递value1,name1和迭代过程调用一样。

    CREATE PROCEDURE [dbo].[UpdateDetails] 
    (
    @l_value NVARCHAR(MAX) = NULL,
    @l_name NVARCHAR(MAX) = NULL,
    @sql NVARCHAR(MAX)
    )
    AS
    BEGIN
    SELECT @sql = 'UPDATE Table1 SET Value = [' + @l_value + '] WHERE Name =['+ @l_name + '] '

    EXEC sp_executesql @sql

    END