使用SQL更新现有记录

时间:2013-12-17 23:59:18

标签: c# sql database sql-server-2008

这个问题似乎有些愚蠢,但我问,因为我的SQL变得非常生疏。

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

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

  1. 在数据库中查找现有记录。
  2. 仅在字段数据不同的情况下更新记录。
  3. 我甚至不确定是否可以在SQL语句中检查它,或者我是否只需要覆盖数据,无论它是否与原始数据相同。

5 个答案:

答案 0 :(得分:1)

所以我猜你正在使用ADO.NET ......

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

当然,你必须确保你所做的任何绑定都存在价值。

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

如戴然所说,如果您选择ORM,您的里程将会更好。实体框架有一点学习曲线。虽然我不是PetaPoco的粉丝,但对于(非常)小规模项目来说这是非常好的。

答案 1 :(得分:0)

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

根据您的问题不明确,您是否需要查看实际代码?

答案 2 :(得分:0)

你可以做到这一点,但它很快就会很长时间啰嗦,如果涉及可空的字段,那就太可怕了。长期以来,标准方法只是覆盖所有领域。 如果您想避免踩踏其他人的编辑,我建议您使用Timestamp字段,并在更新时检查单个列值是否未更改。

答案 3 :(得分:0)

所以这是一种方法论:

1.) Do a equi join
Table1
FirstName LastName PrimaryKey
Jay       Donner    1
Steven    Woods     2
Bruce     Beard     3
Table2 
Firstname LastName PrimaryKey
Jay       Donner    1
Steven    Wood      2
Bruce     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字段中的值不匹配的内容。

Steven    Woods     2
Bruce     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

答案 4 :(得分:0)