使用SQL更新现有记录

本文关键字:记录 更新 SQL 使用 | 更新日期: 2024-10-21 07:36:59

这个问题看起来有点傻,但我问这个问题是因为我的SQL已经很生疏了。

我正在尝试在Microsoft SQL数据库中进行简单的更新。我有一个我自己创建的数据库表条目的对象表示。

它得到了数据库表中的所有字段,现在我所需要做的就是用从客户端应用程序中获得的新数据更新数据库中的原始记录。我从客户那里得到每一个字段,甚至是没有更改的字段。我需要以某种方式做一个SQL语句:

  1. 在数据库中查找现有记录
  2. 仅在字段数据不同的情况下更新记录

我甚至不确定是否可以在SQL语句中检查这一点,或者我是否只需要覆盖数据,不管它是否与原始数据相同。

使用SQL更新现有记录

所以我猜您使用的是ADO.NET…

当您加载对象时,您将在对象上填充主键等效字段。假设它是一个int标识或其他什么,如果你正在创建一个新对象,它将是0。否则,它将是您从数据库加载它时得到的值。

当然,无论您在做什么绑定,都必须确保该值存在。

因此,当您将对象持久化到数据库时,请检查对象上的主键值,并相应地调用insert或update方法。

然而,正如戴所说,如果你选择ORM,你的里程数会大大提高。实体框架有一点学习曲线。虽然我不是PetaPoco的粉丝,但它非常适合(非常)小规模的项目。

所以这里有一个方法:

1.)做等距连接表1名字姓氏主键周唐纳1史蒂文·伍兹2布鲁斯·比尔德3表2名字姓氏主键周唐纳1史蒂文·伍德2Bruce Bears 3

所以内部加入

Select A.FirstName,A.LastName,A.PrimaryKey
From Table1 A INNER JOIN Table2 B
On A.FirstName = B.FirstName 
AND A.LastName = B.LastName

现在结果集将是匹配的字段Jay Donner 1

由于您要查找不匹配的字段您可以使用"not in"命令使用子查询,如下所示:

Select  A.FirstName,A.LastName,A.PrimaryKey
From Table1 A INNER JOIN Table2 B 
ON A.PrimaryKey =B.PrimaryKey
Where A.PrimaryKey NOT IN (
    Select A.PrimaryKey
    From Table1 A INNER JOIN Table2 B
    On A.FirstName = B.FirstName 
    AND A.LastName = B.LastName
)

因此,上面的查询状态是:查找主键匹配的内容,以及属性与firstname和lastname字段中的值不匹配的内容。

史蒂文·伍兹2Bruce Bear 3

现在您知道了需要更新的内容的主键。接下来,使用update语句遍历表。游标是一块蛋糕,但我想有人告诉你在这里使用递归与CTE。祝你好运。。。这就是我讨厌SQL的原因。下面是一个使用游标的递归示例。。。因此,就我个人而言,我会使用带有实体框架的c#来完成这项任务,并使用可执行命令将其包装在SSIS包中,我可以将其作为作业放在SQL Server中。无论如何!。。下面是迭代。

这里是没有注释的示例代码

声明@FName为nvarchar(50)

Declare @LName as nvarchar(100)

声明@PrimaryKeyas int

Declare PersonCursor CURSOR FAST_FORWARD FOR

Select  A.FirstName,A.LastName,A.PrimaryKey
From Table1 A INNER JOIN Table2 B 
ON A.PrimaryKey =B.PrimaryKey
Where A.PrimaryKey NOT IN (
    Select A.PrimaryKey
    From Table1 A INNER JOIN Table2 B
    On A.FirstName = B.FirstName 
    AND A.LastName = B.LastName
)

OPEN PersonCursor
FETCH NEXT FROM PersonCursor
INTO @FName, @LName, @Email

WHILE @@FETCH_STATUS = 0
BEGIN
-- do row specific stuff here

  UPDATE table2
   SET [EmployeeIdentification]=  @Fname, LastName=@LastName
   WHERE PrimaryKey=@PrimaryKey

FETCH NEXT FROM PersonCursor
INTO @FName, @LName, @Email
END

CLOSE PersonCursor
DEALLOCATE PersonCursor

Finds an existing record in the Database

我会把它放在一个存储过程中。

or if I simply have to just overwrite data regardless of it being the same as the original or not.

我个人使用了你的方法,它每次都会更新。只需确保您不会只更新那些不属于主键的列。示例:UPDATE table set firstname = @firstname, @lastname = lastname where userid = @userid。只要确保你不更新UserID

根据你的问题,还不清楚,你需要看实际的代码吗?

你可以这样做,但它会很快变得冗长,如果涉及到可为null的字段,它会变得可怕。长期以来,标准方法只是覆盖所有字段。如果你想避免践踏其他人的编辑,我建议你使用时间戳字段,并在更新时检查单列值是否没有改变。

我们没有足够的时间来编写查询,但为了获得快速帮助,merge命令可以执行您想要的操作。

遵循以下链接

http://www.cs.utexas.edu/~cannata/dbms/SQL%20Merge.html

http://msdn.microsoft.com/en-us/library/bb510625.aspx

http://blog.sqlauthority.com/2008/08/28/sql-server-2008-introduction-to-merge-statement-one-statement-for-insert-update-delete/