背景
我试图更新从表中的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查询以使用连接,然后希望更容易修改为更新命令,没有运气。我还尝试将查询结果插入临时表,然后尝试在临时表上执行更新。然而,当我尝试将临时表放入实际表时,我遇到了另一个问题。
提前致谢
旁注:我已修改变量名称,以便尝试让其他人更容易适应他们的代码,如果解决方案也适用于他们
答案 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)