问题背景:
业务人员要求补打一张17年的标签,根据标签号在系统补打界面进行打印,结果提示“输入字符串的格式不正确”。
解决过程:
1、先是在数据库标签年份表中查询该标签的具体信息,结果正常;
2、通过调试跟踪发现在打印方法中有个字段A在转换成Double类型时报错,问题就出在这里。打印时查询出来的表中该字段的值变成了‘Y’,导致转换失败;
3、跟踪查询语句发现是从视图中查询出字段A的信息。按道理从视图查询和从年份表查询结果应该是一样的。
4、在数据库查看年份表字段的设计信息时发现19年表的字段A顺序和之前的年份表中字段A顺序不一致。而视图的语句是:
- SELECT * FROM txx2019
- UNION ALL
- SELECT * FROM txx2018
- ...
- UNION ALL
- SELECT * FROM txx2011
个人推测视图中查询时会以第一个表的列的顺序作为整个结果集的列的顺序。这样就导致通过视图查询17年数据时字段A的值发生了变化。
5、验证一下推测。创建两个表testA和testB,两个表的字段个数和类型完全一致,后两个字段顺序不一致。
- create table testA (
- A varchar(4),
- B varchar(4),
- C varchar(4),
- D varchar(4)
- );
- create table testB (
- A varchar(4),
- B varchar(4),
- D varchar(4),
- C varchar(4)
- )
插入数据后进行查询。结果就是UNION 和UNION ALL联合查询时会以第一个表的列的顺序作为整个结果集的列的顺序
- select * from testA
- union all
- select * from testB
- --查询结果
- A B C D
- 1 2 3 4
- 2 2 3 4
- 3 2 NULL 4
- 4 2 4 3
-
- select * from testB
- union
- select * from testA
- --查询结果
- A B D C
- 1 2 3 4
- 2 2 3 4
- 3 2 NULL 4
- 4 2 4 3
6、到此问题已经很明确了。但是由于年份表太过久远而且改动的话风险太大,就用其他方法帮业务补打了标签,这个坑就留着吧。
后记:
以后再遇到创建年份表或新增字段的时候一定要注意各字段的顺序和之前的保持一致。