我的代码如下:
"UPDATE Mytable SET Phone= '"+PhoneNumber+"',
Age= '"+Age+"'
Where Name= '"+Name+"'";
现在这里的名字不是唯一的,也不是主键。 当代码搜索匹配时,它必须以降序输入最新记录中的数据。
如果数据库表中的名称列表是:
数据必须符合No.6-Paul'而不是' No.3-Paul'
非常感谢
答案 0 :(得分:4)
要通过已知排序进行更新,您可以使用策略通过用于生成原始查询的相同视图或投影进行更新,并且只要您在一个表中更新数据:
WITH cteUpdate AS
(
SELECT TOP 1 *
FROM MyTable
WHERE Name ='Paul'
ORDER BY YourOrderColumnsHere DESC
)
UPDATE cteUpdate
SET Phone= @PhoneNumber, Age= @Age;
请记住还要参数化您的C#代码!
但请注意,这很容易受到并发问题的影响,例如:如果另一个连接/用户已在此期间更新了记录(例如,自从屏幕上点击了一个按钮),您可能无法更新您认为自己的Paul
。
如果您需要确定性更新,没有密钥就没有很多选项。最好的选择可能是乐观并发黑客,即扩展WHERE以包含先前已知记录值的所有列,即
UPDATE ...
WHERE Name = 'Paul'
and Phone='{oldValueOfPhone}'
and Age = '{oldValueOfAge}';
答案 1 :(得分:1)
这样的事情:
;with x as (
select Phone, Age, row_number() over(partition by Name order by ID desc) as rn
from MyTable
)
update x
set Phone= @PhoneNumber, Age=@Age
where Name= @Name and rn = 1;