2016-06-12 7 views
0

テーブルUserには、ユーザー情報を格納するn個の列があります。更新された列名がSQL Serverの別のテーブルに格納されているテーブルを更新する方法

テーブルUserの変更を一時的に保存するために使用するテーブルUser_Edit_Changesがあります。管理者の確認後に、実際のテーブルUserを新しい値で更新します。

User_Edit_Changesには、更新を要求されたユーザー列とそれに対する新しい値が格納されていました。値の列と新しい値を変更してUser_Edit_Changesから取得し、Userテーブルを更新する動的クエリを作成するにはどうすればよいですか?

ここ

私のサンプルはtableコマンドを作成している、 教師の店舗に関する情報、

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

は、私が言うと思い編集するための教師の要求をfileds Tbl_ProfessorRequest店舗の編集変更要求、 Tbl_ProfessorEditInfoFields店あなたは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' 
    

    これはもちろん、それぞれの列について同様のステートメントを持つ必要があります。ピボットまたはmax + caseを使用して1つの大規模な更新クエリを作成できますが、古い値と新しい値を処理することはかなり複雑になります。

+1

jamesさん、ありがとう、私はあなたが動的クエリで言った2番目のアプローチでそれをしたいが、残念ながら私はどのようにわからない。 –

+0

@MTaherカーソルの中で動的な部分をどうやってやるかという基本的な考え方を追加しました –

関連する問題