0

我有一个名为 hr_Folders 的表,其中包含以下信息:

FolderId    FolderName  EmployeeId  NumberOfEntries IsDeleted   
1            Folder 1      9                 1              0   
2            Folder 2      9                 1              0   
3            Folder 3      9                 1              0   

还有另一个表 hr_EmployeeSavedRegistrants,其中 folderids 保存为 | 像这样的分隔列表:

ID  EmployeeID  RegistrantID    FolderID    
44    9           4           1|2   
45    9           5           1|3       
46    9           6           2

我想创建一个存储过程,当我传递folderid和employeeid时,它会从hr_folder中删除该文件夹,然后相应地更新hr_EmployeeSavedRegistrants表的FolderId列(从folderid列列表中删除folderid,如果hr_EmployeeSavedRegistrants中有一个folderid,然后删除它行如 hr_EmployeeSavedRegistrants 中的第 3 行)

到目前为止编写的代码是:

CREATE PROC GetResumeCountInfolder

@Folder int

AS

DECLARE @FolderIDs VARCHAR(100)
SELECT @FolderIDs = FolderID from hr_EmployeeSavedRegistrants
where deleted = 0
and EmployeeID= 9

请建议如何做

谢谢

4

1 回答 1

0

这是给定您的表结构的解决方案,但是,我同意 Mahmoud 的观点——您确实应该规范化您的表。创建一个名为 hr_EmployeeFolders 的新表,其中 EmployeeId 和 FolderId 作为您的两个字段。然后,您可以存储 1-n 个员工和文件夹。这种方式更容易维护。

但是,鉴于您当前的情况,这样的事情应该可以工作:

create proc updatefolder 
  @FolderId int, @EmployeeId int
as
begin
  update hr_Folders 
  set isdeleted = 1
  where folderId = @folderId and employeeId = @employeeId

  update hr_EmployeeSavedRegistrants 
  set FolderId = replace(replace(folderId, @FolderId, ''),'||','|')
  where employeeId = @employeeId

  update hr_EmployeeSavedRegistrants 
  set FolderId =
    case 
      when left(FolderId,1) = '|' then right(folderId, len(folderId) - 1)
      when right(FolderId,1) = '|' then left(folderId, len(folderId) - 1)
      else FolderId
    end
  where employeeId = @employeeId
end

SQL 小提琴演示

还有一些其他选项可以拆分列表并重新创建,但这是我能想到的最快的。第一个更新语句更新文件夹表中的已删除列。第二个更新语句从 EmployeeSavedRegistrants 表中删除文件夹 ID,以及任何可能的双管道实例。最后的更新语句删除任何开始或尾随管道。

于 2013-05-01T13:22:49.337 回答