一次补打引起的思考

Posted captaintang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次补打引起的思考相关的知识,希望对你有一定的参考价值。

问题背景:

       业务人员要求补打一张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、到此问题已经很明确了。但是由于年份表太过久远而且改动的话风险太大,就用其他方法帮业务补打了标签,这个坑就留着吧。

后记:

  以后再遇到创建年份表或新增字段的时候一定要注意各字段的顺序和之前的保持一致。

 

以上是关于一次补打引起的思考的主要内容,如果未能解决你的问题,请参考以下文章

关于化验室检验条码补打

FastReport之实现打印固定行数,不足补打空白行的办法

C#由转换二进制所引起的思考,了解下?

由优劣语言之争引起的思考

Mybatis如何传递多个参数——一个莫名空指针错误引起的思考

HTML代码中在两个匿名函数中使用同名变量出现bug而引起的变量作用域的思考