2004-01-05

今天遇到一个很怪异的sqlserver的问题

今天我的数据库程序出了问题,很奇怪
代码没有任何的问题

后来才发现是代码调用的一个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 条评论:

发表评论

<< 主页