如何更新我的表,其中更新的列名称存储在SQL Server的另一个表中

时间:2016-06-12 06:11:04

标签: sql sql-server database dynamicquery

我的表User有n列,用于存储用户信息。

我还有另一个表User_Edit_Changes,用于临时存储对表User的更改,以便在管理员确认后,我使用新值更新实际表User

在表User_Edit_Changes中,我存储了请求更新的用户列以及该值的新值。如何编写动态查询以从User_Edit_Changes获取更改的值列和新值并更新User表?

这是我的示例create table命令, 老师店的相关信息, Tbl_ProfessorRequest存储编辑更改请求, Tbl_ProfessorEditInfoFields存储教师请求编辑的文件

CREATE TABLE [dbo].[Teacher](
[code_ostad] [numeric](18, 0) NOT NULL,
[name] [varchar](30) NULL,
[family] [varchar](40) NOT NULL,
[namep] [varchar](30) NULL,
[idmadrak] [numeric](18, 0) NULL,
[namemadrak] [varchar](50) NULL,
[idresh] [numeric](18, 0) NULL,
[nameresh] [varchar](50) NULL,
[martabeh] [numeric](18, 0) NULL,
[namemartabeh] [varchar](30) NULL,
[nahveh_hamk] [numeric](18, 0) NULL,


CREATE TABLE [Request].[Tbl_ProfessorRequest](
[ProfessorRequestID] [int] IDENTITY(1,1) NOT NULL,
[Code_Ostad] [int] NULL,
[RequestTypeID] [bigint] NULL,
[RequestLogID] [bigint] NULL,
[CreateDate] [nvarchar](10) NULL,
[Note] [nvarchar](1000) NULL,
[term] [nvarchar](8) NULL,
[ProfessorMessage] [nvarchar](1000) NULL,
[Erae_Be] [nvarchar](100) NULL,
[ChangeSet] [int] NULL,
[isdeleted] [bit] NOT NULL,
[ScanImageUrl] [nvarchar](300) NULL,




 CREATE TABLE [Request].[Tbl_ProfessorEditInfoFields](
[Id] [int] IDENTITY(1,1) NOT NULL,
[code_ostad] [int] NOT NULL,
[teacher_Column_Name] [nvarchar](200) NULL,
[OldValue] [nvarchar](200) NULL,
[NewValue] [nvarchar](200) NULL,
[State] [int] NOT NULL,
[ProfessorRequestID] [int] NOT NULL,

1 个答案:

答案 0 :(得分:0)

我说你有3种选择:

  1. 处理数据库外部的更新逻辑,无论您的应用程序是用什么构建的。这很可能是最简单的方法,因为这种动态处理并不是数据库所擅长的。

  2. 根据User_Edit_Changes的内容构建动态SQL子句。循环遍历表中的更改,在变量中构造update语句并使用sp_executesql执行它。使用游标,代码应该是这样的:

    set @params = N'@NewValue varchar(100)'
    
    fetch next from yourcursor into @FieldName, @NewValue
    
    while @@FETCH_STATUS = 0 begin    
      set @sql = 'update User set ' + @FieldName + ' = @NewValue'
      exec sp_executesql @sql, @params, @NewValue = @NewValue  
    
      fetch next from yourcursor into @FieldName, @NewValue
    
    end
    
  3. 创建用于更新每个列的静态SQL语句。你可以建立这样的东西:

    update U
    set U.UserName = C.NewValue
    from
      User U 
      join User_Edit_Changes C on U.UserId = C.UserId
    where
      C.FieldName = 'UserName'
    

    为此,您当然需要为每个列添加类似的语句。您可以使用pivot或max + case构建一个大规模更新查询,但处理旧值和新值会非常复杂。