1、环境
前端:ASP、vbscript
后端:vb
数据库:Sql Server
2、问题描述
最近在做需求时碰到一个很奇怪的问题,后端通过select *查询带出来的字段,在前端只能获取到部分字段的值,有些字段的值获取不到。
3、解决方法
后来是把sql语句中 p.*的位置放在所有字段的最后面,并且调整了该表的字段顺序,把”text“类型的字段的位置放在最后,即:
在sql语句中,把.*查询也放到最后。
再次调试程序,之前缺失的字段都显出出来了。
4、产生原因
在sql server中是不建议使用select *查询,因为.*查询会查出许多不必要的字段,增大数据库负担,数据传输时间和网络开销。并且在数据库中出现了text这种大数值类型。sqlserver中text字段的最大长度是2^31-1给字符(即2G的存储容量)。因为text字段没有指定长度,所以对于表中的text字段数据库会默认分配很大的空间给这个字段。对于这些大字段,在查询的时候,长度超过 728 字节的时候,会先把超出的数据序列化到另外一个地方,因此读取这条记录会增加一次 io 操作。sqlserver执行select *操作时,是按表结构中字段的定义顺序依次查询的,由于测试环境比较差,因此对于text这种类型的大字段,有可能出现查询超时,导致其他字段也查不到的现象。解决方案是建表的时候尽量避免使用像text这种未定义长度的大字段,如果用了,则把text这种大字段放到表结构所有字段的最后,以及在查询时把大字段的查询顺序放在最后以避免影响其他字段的查询。
5、关联问题
ADODB.Recordset 错误 '800a0bcd' BOF 或 EOF 中有一个是“真”,或者当前的记录已被删除,所需的操作要求一个当前的记录。
这个问题是由于获取到的select查询的结果集为空导致的,其产生原因也有可能是上文所说的大字段然后查询超时导致其他字段查不到。
6、参考资料
SQL Server中Text和varchar(max)数据类型区别 - 亮将 - 博客园 (cnblogs.com)https://www.cnblogs.com/liangjiang/p/5660902.htmlSQL server 数据库TEXT字段的最大长度问题 急急!-CSDN社区https://bbs.csdn.net/topics/266764