我有一张桌子说'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
更新此表的最佳方法是什么?
答案 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