最近在修bug的时候出现了一个问题,系统中会根据项目的多少动态的去创建一个视图来将所有项目的某些数据union到一起。当系统的项目数量超过256时,问题出现了。SQL Server会抛出如下异常:
Msg 106, Level 15, State 1, Procedure vsp_T, Line 256
Too many table names in the query. The maximum allowable is 256.
当然将所有项目的数据union到一个视图绝对是一个蹩脚的设计,然而要改这个设计着实困难,怎么办呢?
经过测试发现SQL Server T-SQL批处理完全支持union256个以上的表,而且存储过程也支持引用超过256个以上的表。
于是将原先创建视图的语句由create view 改为 create procedure,存储过程不带任何参数;原先调select * from 视图地方的SQL语句改为exec存储过程。
这样系统项目数量再也不受256的限制了。
不过当系统中的项目多达10000时,单单创建一个union所有项目数据的存储过程就花了十几秒,而执行这个存储过程花了4分钟多。所以,要根本解决这个问题,还是应该从设计上避免出现多表union或者join的情况!