2016-06-12 22 views
0

我有表User與n列存儲用戶信息在其中。如何更新我的表更新列名存儲在另一個表中的SQL Server

我有另一個表User_Edit_Changes,我用它來臨時存儲對錶User的更改,以便管理員確認後,我用新值更新實際表User

在表User_Edit_Changes中,我存儲了哪個用戶列請求更新以及什麼是新值。如何編寫動態查詢以獲取User_Edit_Changes剛更改的值列和新值並更新User表?

這裏是我的樣品create table命令, 老師店的相關信息, 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. 根據User_Edit_Changes的內容構建動態SQL子句。循環訪問表中的更改,將更新語句構造成變量並使用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

謝謝詹姆斯,我想在第二種方法中做到這一點,你通過動態查詢告訴,但不幸的是我不知道如何。 –

+0

@MTaher我添加了基本的想法如何做光標內的動態部分 –

相關問題