Sql server 在SQL select语句中将列名作为声明变量重用

Sql server 在SQL select语句中将列名作为声明变量重用,sql-server,tsql,variables,reusability,Sql Server,Tsql,Variables,Reusability,我正在做一个项目,其中每个月都会更改列名。因此,我试图声明一个变量,其中包含可以重用的列名。 所以我做了这个 declare @cal_name varchar(max) = 'ID' select @cal_name from Table_A union all select @cal_name from Table_B 但这只是在结果框中将ID打印为字符串。 我不想使用另一个变量来存储sql语句,有人能帮我根据我的要求进行查询吗。类似这样的事情吗 declare @cal_name var

我正在做一个项目,其中每个月都会更改列名。因此,我试图声明一个变量,其中包含可以重用的列名。 所以我做了这个

declare @cal_name varchar(max) = 'ID'
select @cal_name from Table_A
union all
select @cal_name from Table_B
但这只是在结果框中将ID打印为字符串。 我不想使用另一个变量来存储sql语句,有人能帮我根据我的要求进行查询吗。

类似这样的事情吗

declare @cal_name varchar(max) = 'ID'    
exec
(
    'select ' + @cal_name + ' from Table_A
    union all
    select ' + @cal_name + ' from Table_B'
)

它不是那样工作的。您必须使用动态SQL。搜索动态SQL。您可以声明服务器,因为语言可能会有所不同。但如果我在声明该列时不使用单引号,那么它将给出error@Ben这不是OP的意图。他们的目的是让它写出并执行
从表A中选择ID…
(注意缺少引号)。这将需要,OP,将SQL语句写入VARCHAR变量,然后动态执行它。这取决于您在这里使用的RDBMS。在我看来,您没有描述其背后的内容,这是一个非常奇怪的要求-您到底为什么每个月都要更改列名?!?听起来像一场噩梦;我试图想象一些表单、报表和包依赖于列名经常更改的表。我真的不想做你的工作。只是一个想法/问题:数据模型设置正确吗?这些列名如何更改?从一月到二月等等?如果是这样的话,为什么不改为使用两列:ID和DATE,它们实际上是按比例缩放的,与您当前的情况相反。