这个问题,来自今天处理一个工资项显示问题,要求是员工查询工资时,假如当月全部员工都没有的薪酬项,就不显示
这个问题也跟近几个月有关,年初么,有的地方就发年终奖了,只是一个月有,或者个别月有,另外还有高温补贴,其他福利等等。就不一一列举了
了解了情况就进去正题吧
一、第一段SQL是查询出当月配置的工资项,然后用SUM进行了求和,(emmm,写到这,发现好像...万一...出现了负数,相抵扣了怎么办,写完赶紧改了,[狗头保命])
求和之后,我们就筛选掉和为0的数据,再选出需要的列。然后再到实际代码中处理 name in(@InLastItem) ,以实现上诉问题。
二、在这之中呢,发现了两个问题,其中一个就是这里要写的
1、看图
在第一个黄色边框,是一个固定排除的写法,第二个就是我要加的需求改动的地方。红色框内,就是变量参数,以及他的结果
问题就出在这,我们使用变量带入,是得不出结果的,使用变量结果是可以得出要的效果。
.......自己做的时候想了挺久,搞不变了,问大佬。
经过大佬的指点,我找到了门路。
因为变量类型为Nvarchar,他在这里执行的时候就把整体的值作为了一个Nvarchar值,而不是我们以为的“满勤奖”、“业绩奖”、“总经理奖”......这样一个一个拆分的单个Nvarchar值
(还是存在疑惑,为什么,为什么就不能变成单个执行?)
所以,在薪酬项目中,是找不到这样的值的。
总结了上边的问题,既然使用结果是可以,但是变量不行,那么,我把整个后边的SQL使用一个Nvarchar(max)变量保存,然后在最后的时候使用EXEC(@SQL) 是否就可以达到效果了呢?
经过实践,这样的拼接是有效的。
在后边的某一时刻,我又想到了我之前的文章,SQL Server 拆分字符串(函数),问题处理存在相似之处。
后边再使用了[]符号来拼接,也是行不通,至此,只有上边执行EXEC的方法可行了。(相信还是有的,但是还未寻找到)
后边再补一篇文章写 stuff 、FOR xml PATH 的使用。