数据库存储过程

时间:2013-12-10 20:46:40

标签: sql tsql stored-procedures relational-database

我对存储过程有疑问。假设我的数据库中有2个表UserEducation

Table User       Table Education  
UserID           University
UserName         Qualification
...              Field of Study
...              .........
....             .........
....             UserID

问题是,例如:一个用户有两个学位(教育),当我尝试更新学位时,它会更新两个学位。

这是我的存储过程:

CREATE Procedure [dbo].[UpdateEducation]
   @University,
   @Qualification,
   @FieldOfStudy,
   @Grade,
   @GDate,
   @Location,
   @Major,
   @AddtionalInfo,
   @UserID
AS
BEGIN

Update Education SET

University =@University,
Qualification=@Qualification,
FieldOfStudy=@FieldOfStudy,
Grade=@Grade,
GDate=@GDate,
Location=@Location,
Major=@Major,
AddtionalInfo=@AddtionalInfo

WHERE UserID=@UserID

END

GO

希望有人可以帮助我,因为我还是新手。 TQ

2 个答案:

答案 0 :(得分:0)

如果没有唯一标识要更新的记录所需的所有信息,您的存储过程在技术上无法更新行。

你可以通过几种方式解决这个问题:

  1. 在Education表中引入单独的主键以进行查找 目的。
  2. 将原始数据(更新前)传递到您的存储中 过程,以便您可以查找您正在尝试的确切行 改变。
  3. 标识可用于查找的单独复合唯一键 不包括将被修改的数据。
  4. 使用一些可更新的游标(可能无法取决于什么 客户技术是。)。

答案 1 :(得分:0)

您遇到的主要问题是您的用户表在教育表上将是1对多。您的更新告诉它更新教育表中UserID = @UserId的所有记录。您的更新语句需要引用教育表中的特定行。

Update Education
   set field = value
where UserId = UserIdValue
and {pickAnotherField} = newFieldValue

但是,您仍然存在以这种方式进行多次和无意更新的风险,更好的解决方案是添加唯一标识符(Education_ID)并使其成为主键。然后,您可以在更新中使用它,并确保只更新一行。