我被要求更新的应用程序使用少量表格生成报告。
Table1 将 id 和对字段的引用保存到另一个具有配置项的表。
Table2 是配置表,用于保存对报告的引用,这些报告的值在动态添加的列中,如 usercol1、usercol2...usercol55。
我不知道如何使用 [column name] 作为值来更新 tempname。我在下面编写了 DDL,但是 UPDATE 查询不起作用,因为 a.colnum 未被识别为列。
我需要的报告是这样的:
1 bob
2 john
3 jack
4 ben
如果我将 UPDATE 编写为带有连接
a.usercol + cast(a.colnum as varchar(2))
的常规内联查询,我得到的结果是:
1 usercol32
2 usercol2
3 usercol7
4 usercol7
所以,我想我需要像下面的 DDL 一样将 UPDATE 查询编写为动态 sql。正如预期的那样,它正在产生错误
消息 4104,级别 16,状态 1,第 25 行
无法绑定多部分标识符“a.colnum”。
我可以写一个带有附加表的循环,将 [colnum] 的内容转储到变量中并用该变量更新列......有没有办法在没有循环的情况下编写这个查询。
这是DDL:
create table #Table1 (id int, colnum int)
create table #Table2 (id int, usercol1 varchar(20), usercol2 varchar(20), usercol3 varchar(20), usercol7 varchar(20), usercol32 varchar(20))
insert into #Table1(id, colnum) values(1, 32);
insert into #Table1(id, colnum) values(2, 2);
insert into #Table1(id, colnum) values(3, 7);
insert into #Table1(id, colnum) values(4, 7);
insert into #Table2(id, usercol32) values(1, 'bob');
insert into #Table2(id, usercol2) values(2, 'john');
insert into #Table2(id, usercol7) values(3, 'jack');
insert into #Table2(id, usercol7) values(4, 'ben');
CREATE TABLE #Temp
(
tempid int,
tempname varchar(20)
)
insert into #Temp (tempid)
select id from #Table1
declare @sql varchar(max)
set @sql = 'update #Temp'
+ ' set tempname = a.usercol' + cast(a.colnum as varchar(2))
+ ' from #table1 a'
+ ' join #table2 b on a.id = b.id'
+ ' where #Temp.tempid = a.id'
exec (@sql)
select * from #Temp
drop table #Temp
drop table #Table1
drop table #Table2