今天我的数据库程序出了问题,很奇怪
代码没有任何的问题
后来才发现是代码调用的一个view出了问题,view里面的输出,居然丢失了一列,这列全部变成NULL,所有后面的列自动后移
这样字段对应的数据类型就变了,所以程序不能运行
可是我看了100遍,view的定义没有发生任何变化,正当我百思不得其解的时候,我开始修改view代码的缩进,一句一句的分析,还是没有问题,退出去,程序居然对了
再去看view的输入也不错行了,,,,
对sqlserver表示极大的愤慨和怀疑
附:在MOP程序员联盟里面关于这个问题的讨论
今天遇到一个很怪异的sqlserver的问题
--------------------------------------------------------------------------------
今天我的数据库程序出了问题,很奇怪
代码没有任何的问题
后来才发现是代码调用的一个view出了问题,view里面的输出,居然丢失了一列,这列全部变成NULL,所有后面的列自动后移
这样字段对应的数据类型就变了,所以程序不能运行
可是我看了100遍,view的定义没有发生任何变化,正当我百思不得其解的时候,我开始修改view代码的缩进,一句一句的分析,还是没有问题,退出去,程序居然对了
再去看view的输入也不错行了,,,,
对sqlserver表示极大的愤慨和怀疑
(发帖时间:2004-1-5 12:21:57)
---tinyfool J
回复(1):
sqlserver是不会犯这样的错误的。
100%一定是你的程序犯错。
---匿名人士777384 b
回复(2): 楼上是走9遍,233
从概率上讲我出错的几率比sqlserver大得多
但是,MS可不是不出错,MS出的错也很多,而且这样类似的东西又不是没有遇到过
---tinyfool J
回复(3): 大胆的揣测一下:
后来才发现是代码调用的一个view出了问题,view里面的输出,居然丢失了一行,这行全部变成NULL,所有后面的行自动后移
这样字段对应的数据类型就变了,所以程序不能运行
介个意思是说,丢失了一行,然后所有的行会后移?丢失了一行,应该是所有行前移才对啊。
如果只是丢失行,字段应该不会错位的说,当然不会存在类型不匹配的错误....
你....
---匿名人士777384 b
回复(4): 缩进导致出错?头一次听说。
不过有时候ms出的问题就是很蹊跷,比如我 blog上写的这个,还不是百思不得其解
相关链接:
http://blog.codelphi.com/netfire/posts/696.aspx
---Fire J
回复(5): 走9遍,看样子你语文不及格
偶说的丢失列是列的数据丢失,全部被NULL填充,然后,所有的列后移
这么说如果不清楚,偶给你一个例子好了
正确的数据
A1 A2 A3 A4
1 '2' '3' 4
5 '6' '7' 8
出了问题以后的数据,问题出在A2一列
A1 A2 A3 A4
1 null '2' '3'
5 null '6' '7'
但是构成View的那几个表都素完全正常的,而A4原本是int,现在变成了变成了varchar,所以我后面有一些利用这个view产生新表的存储过程就不行了....
---tinyfool J
回复(6): 如果是我代码写错的,至少这个view一打开就素代码错误的提示吧!
还有代码错误,我这个null列是怎么出来的呢???
---tinyfool J
回复(7):
行...列....
楼上的语文真行...
明明是多了一列,偏偏说是少了一行...
出这样的错误,在所难免,俺能理解你...
---匿名人士777384 b
回复(8): 走9遍,行列的问题偶不和你讨论,那个是打字打错了
至于多少的问题,你确实没看懂,多了一个null列,我肯定要少了一个有意义的列,这个没有什么疑问了吧?
---tinyfool J
回复(9): 你要是有兴趣,倒是可以帮我想想数据和程序哪里出错可能会引发这样的问题,然后什么代码都不修改的情况下,这样的问题又怎么可能解决吧???
不然的话,我还是要认为是sqlserver的错误了
---tinyfool J
回复(10): 和一个朋友讨论的结果....
383023(Illusion) 12:27:11
view也是要编译的。
你可能看到的是未编译的版本。
30010(Tinyfool) 12:27:22
我觉得有可能是这个问题
30010(Tinyfool) 12:27:34
但是我一直用这个view没有问题
30010(Tinyfool) 12:28:07
我觉得最后的解决是因为view代码改变以后重新编译,所以就正常了
30010(Tinyfool) 12:28:10
你说呢?
383023(Illusion) 12:28:35
有理!
30010(Tinyfool) 12:28:42
;) 我想到了一个可以试验的方法了,我去试验一下我的推论
30010(Tinyfool) 12:28:49
如果是这么回事儿就对了
---tinyfool J
回复(11): 我现在对这个解释比较满意,正在试验验证中....
---tinyfool J
回复(12): 现在的推论,但是只是推论,按照这个推论做的试验没有成功
30010(Tinyfool) 12:46:43
我现在估计问题是这样的
30010(Tinyfool) 12:46:50
构成视图有5个表
30010(Tinyfool) 12:47:09
其中一个最主要的表里面我前些日子多加了一个字段
30010(Tinyfool) 12:47:43
而且是加入在作为连接表的某个外键的前面
383023(Illusion) 12:47:45
什么原因使代码没有编译呢?
是不是用查询分析器了?
30010(Tinyfool) 12:47:58
view没有变化啊!
30010(Tinyfool) 12:48:05
只是我的表变化了
30010(Tinyfool) 12:48:34
我估计编译以后的view,联接的时候用的不是字段名字,而是字段编号一类的东西
383023(Illusion) 12:48:38
你用了select *?
30010(Tinyfool) 12:48:45
有*
30010(Tinyfool) 12:48:48
对
383023(Illusion) 12:49:29
那个*我从来不用。
用企业管理器生成的sql语句最方便。
30010(Tinyfool) 12:49:50
嗯,你说的*可能是一个问题
30010(Tinyfool) 12:50:02
我用的也是企业管理器啊!
30010(Tinyfool) 12:50:32
就是说表更新了,但是view编译的时候联接的是字段编号
383023(Illusion) 12:50:41
sql server还是比较好用的。就是没用过太大的数据量,
我写过运算很复杂的t-sql。如果硬件好的话。还不错。
30010(Tinyfool) 12:50:48
所以表更新了结构以后,应该把view也更新一下
30010(Tinyfool) 12:50:50
你说呢?
30010(Tinyfool) 12:51:05
我用sqlserver的主要原因就是好配置
30010(Tinyfool) 12:52:09
不过,我做了几次试验都得不到一样的错误
383023(Illusion) 12:52:16
我没遇到过这种情况。
30010(Tinyfool) 12:52:18
现在只能是这么推论了
---tinyfool J
回复(13): Create Table TestAB
(
field1 char(1) not null
)
go
create view TestViewA as select * from TestAB
go
select * from TestViewA
go
alter table TestAB add column field2 int
go
select * from TestViewA
go
是这样的吗?
---匿名人士777384 b
回复(14): 问题差不多,但是view本身复杂一些,是很多表的连接
可能和连接也有关系
我估计现在在原数据库上在加一个新的字段可以重复这个错误,但是这个是公司的人事数据库,而且这两天马上要发工资了
我可不敢在这个数据库上面随便做实验
我做的简单试验都没有产生这个错误
---tinyfool J
回复(15): 我遇到过比编译出错更怪异的事情:
一个复杂的SQL语句在查询分析器里执行好好的,放到企业管理器里面执行就不对了(企业管理器会自动的重新排列SQL语句 -- 这个功能好像叫查询优化什么的 -- 结果给“优化”错了).
不幸的是我写程序的时候先用企业管理器作验证....浪费了我整整一天...
---caitsith J


请不要吝惜您的评论,每一条评论,都是我在漫漫长夜前行的力量
0 条评论:
发表评论
<< 主页