繁体   English   中英

如何通过从SQL Server中的另一个表动态获取列名来更新列

[英]How to Update a column by getting the column name dynamically from another table in sql server

 create table #tableA
(
    Id int,
    ColumnName1 nvarchar(50),
    ColumnName2 nvarchar(50),
    ColumnName3 nvarchar(50),
    ColumnName4 nvarchar(50) 
) 
 create table #tableB
(
    Id int,
    UpdateColumn nvarchar(50),
    UpdateValue nvarchar(50)
) 

Insert Into #tableA values (1,'Val1','Val2','Val3','Val4')
Insert Into #tableA values (2,'Val1','Val2','Val3','Val4')
Insert Into #tableA values (3,'Val1','Val2','Val3','Val4')
Insert Into #tableA values (4,'Val1','Val2','Val3','Val4')

Insert Into #tableB values (1,'ColumnName4','Column4Value')
Insert Into #tableB values (2,'ColumnName1','Column1Value') 

declare @Sql nvarchar(max)
set @Sql='Update a set {The column should be the value from b.UpdateColumn}={b.UpdateValue} from #tableA a join #tableB b on a.Id=b.Id'

print @Sql
exec sp_executesql @Sql 

我需要根据#tableB值动态更新#tableA列。

我试图通过连接join子句中的值来构建动态sql,但没有任何效果。

请提出建议..预先感谢...

我会使用动态SQL来做到这一点(尽管可以)。 假设每个id只有一个更新,用case

update a
    set ColumnName1 = (case when b.UpdateColumn = 'ColumnName1' then b.UpdateValue else ColumnName1 end),
        ColumnName2 = (case when b.UpdateColumn = 'ColumnName2' then b.UpdateValue else ColumnName2 end),
        ColumnName3 = (case when b.UpdateColumn = 'ColumnName3' then b.UpdateValue else ColumnName3 end),
        ColumnName4 = (case when b.UpdateColumn = 'ColumnName4' then b.UpdateValue else ColumnName4 end)
    from #tableA a join
         #tableB b
         on a.id = b.id;

如果要从参考表中生成一条update语句,则可以使用stufffor xml将所有操作连接为一个字符串值:

if object_id('tempdb..#tableA') is not null
drop table #tableA;
if object_id('tempdb..#tableB') is not null
drop table #tableB;

create table #tableA
(
    Id int,
    ColumnName1 nvarchar(50),
    ColumnName2 nvarchar(50),
    ColumnName3 nvarchar(50),
    ColumnName4 nvarchar(50) 
);
insert Into #tableA values (1,'Val1','Val2','Val3','Val4'),(2,'Val1','Val2','Val3','Val4'),(3,'Val1','Val2','Val3','Val4'),(4,'Val1','Val2','Val3','Val4');

create table #tableB
(
    Id int,
    UpdateColumn nvarchar(50),
    UpdateValue nvarchar(50)
);
insert Into #tableB values (1,'ColumnName4','Column4Value'),(1,'ColumnName3','Column3Value'),(2,'ColumnName1','Column1Value');

declare @sql nvarchar(max);
with c as
(
select distinct id
                ,stuff((select char(10) + '   ,' + UpdateColumn + ' = ''' + UpdateValue + ''''
                        from #tableB
                        where id = b.id
                        for xml path('')
                        ),1,5,'') as Cols
from #tableB b
)
select @sql = stuff((select ';update #tableA set'
                            + char(10)
                            + '    ' + c.Cols
                            + char(10)
                            + 'where id = ' + cast(c.id as nvarchar(10))
                            + char(10)
                            + char(10)
                from c
                for xml path('')
                ),1,1,'')

print @sql;
exec sp_executesql @sql;

输出并执行以下脚本:

update #tableA set
    ColumnName4 = 'Column4Value'
   ,ColumnName3 = 'Column3Value'
where id = 1

;update #tableA set
    ColumnName1 = 'Column1Value'
where id = 2

使用触发器。

CREATE TRIGGER triggerName ON [dbo].[tableB] 
AFTER Update
AS
Begin
--Update tableA here
End

现在,每次更新tableB时,都会调用此触发器,您可以在其中使用任何条件。

drop table if exists #tableA;
drop table if exists #tableB;

create table #tableA
(
    Id int,
    ColumnName1 nvarchar(50),
    ColumnName2 nvarchar(50),
    ColumnName3 nvarchar(50),
    ColumnName4 nvarchar(50) 
) 
 create table #tableB
(
    Id int,
    UpdateColumn nvarchar(50),
    UpdateValue nvarchar(50)
) 

Insert Into #tableA values (1,'Val1','Val2','Val3','Val4')
Insert Into #tableA values (2,'Val1','Val2','Val3','Val4')
Insert Into #tableA values (3,'Val1','Val2','Val3','Val4')
Insert Into #tableA values (4,'Val1','Val2','Val3','Val4')

Insert Into #tableB values (1,'ColumnName4','Column4Value')
Insert Into #tableB values (2,'ColumnName1','Column1Value') 

declare @Sql nvarchar(max)

select
    @SQL = string_agg('update a
    set
        ' + b.UpdateColumn +  ' = ''' + b.UpdateValue + '''
    from #tableA a', ';')
from #tableB b

print @Sql
exec sp_executesql @Sql

select
*
from #tableA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM