我的表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,
答案 0 :(得分:0)
我说你有3种选择:
处理数据库外部的更新逻辑,无论您的应用程序是用什么构建的。这很可能是最简单的方法,因为这种动态处理并不是数据库所擅长的。
根据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
创建用于更新每个列的静态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构建一个大规模更新查询,但处理旧值和新值会非常复杂。