C#基于select语句的结果更新SQL Server表

时间:2017-09-01 08:36:54

标签: c# sql-server dictionary sql-update

背景

我试图更新从表中的select语句返回的特定行集。该表由id和值组成。 ids不是唯一的,因为有一列指示修订。

目前

我要做的是从C#中更新每个ID的最新版本的值。

到目前为止,我编写的select语句返回了最新版本的所有id和值。

SELECT id, value
FROM table1 AS T1
WHERE createdOn = (SELECT MAX(createdOn)
                   FROM table1 AS T2
                   WHERE T1.id = T2.id)

我在C#中创建了包含id和值的SQL参数。我将使用id来标识我需要插入新值的行。我当然会使用该值作为要插入该id的值。

以下是参数:

SqlParameter idParameter = new SqlParameter("@id", SqlDbType.Int);
SqlParameter valueParameter = new SqlParameter("@updatedValue", SqlDbType.NVarChar);

在C#中,我有一个字典,用于存储之前已经更新为新值的ID和值。

Dictionary<int, string> updatedValues = new Dictionary<int, string>();

我打算遍历这个字典并将SQL参数设置为字典中当前键和值的参数。我目前的代码如下:

foreach (var entry in updatedValues)
{
    idParameter.Value = entry.Key;
    valueParameter.Value = entry.Value;

    //perform sql update command
}

如评论所示,我认为需要执行SQL更新命令。

指导如何执行此操作以及SQL查询字符串将确保仅更新最新修订版的内容将非常受欢迎。

我尝试过的事情

我尝试修改我的SQL查询以使用连接,然后希望更容易修改为更新命令,没有运气。我还尝试将查询结果插入临时表,然后尝试在临时表上执行更新。然而,当我尝试将临时表放入实际表时,我遇到了另一个问题。

提前致谢

旁注:我已修改变量名称,以便尝试让其他人更容易适应他们的代码,如果解决方案也适用于他们

3 个答案:

答案 0 :(得分:0)

您不能只在原始的select语句中检索createdOn,然后使用它与id一起识别确切的行,例如

UPDATE table1 SET value = @updatedValue WHERE id = @id and createdOn = @createdOn

答案 1 :(得分:0)

我认为你可以使用分区,试试select distinct id,max(createdOn) over (partition by id) as "lastcreatedOn" from YourTable 这将按每个id对表进行分区,并选择每个id的最大日期值。把它放到一个存储过程中,将你的id和new值传递给db服务器,而不是你的c#代码,我建议你。 编辑:也许这样

CREATE PROCEDURE UpdateWhatever   
    <@id> nvarchar(255),  
    <@value> nvarchar(255)  
AS  
BEGIN  
    SET NOCOUNT ON;  
    select distinct id,@LastRev = max(createdOn) over (partition by id) as "lastcreatedOn"  
from YourTable  
where id=@id

update YourTable set value = @val  
where id=@id and createdOn=@LastRev
END

答案 2 :(得分:0)

这是你的选择陈述:

SELECT id, value
FROM table1 AS T1
WHERE createdOn = 
    (SELECT MAX(createdOn)
        FROM table1 AS T2
        WHERE T1.id = T2.id)

相应的更新声明将是:

UPDATE T1
SET T1.value = 'your value'
FROM table1 AS T1
WHERE createdOn = 
    (SELECT MAX(createdOn)
        FROM table1 AS T2
        WHERE T1.id = T2.id)