SQL如何将拼接动态列名字符串转合适类型匹配a.cui实现关联
你当前写法的核心错误不是类型不匹配,而是拼接得到的是纯字符串文本,不是对b表对应列的引用,你现在相当于在拿a.cui的值和固定字符串'b.cy21_cui'做比对,自然和原逻辑a.cui = b.cy21_cui(拿a.cui和b表cy21_cui列的存储值比对)的效果完全不同,这种问题靠CAST类型转换是解决不了的。
以下是两种可行解决方案:
方案1:用CASE WHEN实现动态列取值(推荐,无SQL注入风险)
如果你的年份列范围可控(比如只会用到最近若干年的cyxx_cui列),直接用CASE判断截取到的年份,取对应列的值即可,写法如下:
select distinct bn from fc_2021 a join M..rx_crsw b on a.cui = CASE substring('2021-08-31',3,2) WHEN '21' THEN b.cy21_cui WHEN '22' THEN b.cy22_cui WHEN '23' THEN b.cy23_cui -- 补充其他你需要用到的年份对应分支即可 END join nf_bsc..cvrg c on b.abc=c.abc where a.Eff_Date<='2021-08-31' and a.term_date>='2021-08-31' and PA_Type<>0
如果是SSRS参数传入日期,把上面所有'2021-08-31'替换成你的SSRS日期参数引用即可,比如@ReportDate。
另外你提到a.cui是varchar(8),b的对应列是nvarchar(30),关联时可以加个显式转换避免隐式转换影响性能:CAST(a.cui AS NVARCHAR(30)) = CASE ...
方案2:动态SQL执行
如果年份列范围不固定,不想维护CASE分支,可以用动态SQL拼接整个查询语句,示例如下:
DECLARE @yearSuffix VARCHAR(2) = substring('2021-08-31',3,2) DECLARE @sql NVARCHAR(MAX) = N' select distinct bn from fc_2021 a join M..rx_crsw b on a.cui = b.cy'+@yearSuffix+'_cui join nf_bsc..cvrg c on b.abc=c.abc where a.Eff_Date<=''2021-08-31'' and a.term_date>=''2021-08-31'' and PA_Type<>0 ' EXEC sp_executesql @sql
如果是SSRS场景,你可以直接在数据集的查询设计里,用SSRS的表达式拼接SQL语句,一样可以实现动态列引用的效果。
内容的提问来源于stack exchange,提问作者krehkop
相关产品推荐
相关产品推荐

