2016-06-12 2 views
0

У меня есть таблица User с n столбцами, в которых хранится информация пользователя.Как обновить таблицу, в которой обновлены имена столбцов, хранящихся в другой таблице в SQL Server

У меня есть еще один стол User_Edit_Changes, который я использую для временного хранения изменений в таблицу User в него так, что после подтверждения администратора я обновлять реальную таблицу User с новыми значениями.

В таблице User_Edit_Changes я сохранил, какой пользовательский столбец запросил обновление и что для него новое значение. Как написать динамический запрос, чтобы получить только что изменившиеся столбцы значений и новое значение от User_Edit_Changes и обновить таблицу User?

здесь мой образец создать команду таблицы, учитель хранит информация о, Tbl_ProfessorRequest запрос хранит редактировать изменения, Tbl_ProfessorEditInfoFields магазины, которые fileds запрос учителя редактировать

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

Точно так же вы будете выполнять регулярный запрос на обновление, построить его в строке и затем выполнить строку. – Chuck

+1

Не могли бы вы добавить инструкции DDL для всех этих таблиц? –

ответ

0

Я бы сказал, что у вас есть 3 варианта:

  1. Обращайтесь с логикой обновлений за пределами базы данных, с которой когда-либо создавалось ваше приложение. Скорее всего, это самый простой способ, так как этот вид динамической обработки - это не то, на что хорошо работают базы данных.

  2. Создайте динамическое предложение SQL на основе содержимого User_Edit_Changes. Перебирайте изменения в таблице, создайте инструкцию обновления в переменной и используйте 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, но обработка старых и новых значений становится довольно сложной.

+1

спасибо james, я хочу сделать это во втором подходе, который вы сказали динамическим запросом, но, к сожалению, я не знаю, как это сделать. –

+0

@MTaher Я добавил основную идею о том, как сделать динамическую часть внутри курсора –

Смежные вопросы