最近敲的组合查询,用到了存储过程,遇到了很多问题,现在写出来与大家分享。
存储过程建立
存储过程的建立很简单,在数据库中的可编译性下的存储过程中直接新建就可以了。
或者新建查询,输入存储过程对应的SQL语句就行:Create proc [dbo].[procTemp] @cboFieldA varchar(10), @cboOperatorA varchar(10), @txtConditionA varchar(10), @cboRelationA varchar(10), @cboFieldB varchar(10), @cboOperatorB varchar(10), @txtConditionB varchar(10), @cboRelationB varchar(10), @cboFieldC varchar(10), @cboOperatorC varchar(10), @txtConditionC varchar(10), @tableName varchar(10) AS declare @TempSql varchar(500) BEGIN set @TempSql='select * from ' +@tableName +' where'+CHAR(32)+@cboFieldA+@cboOperatorA+CHAR(39)+@txtConditionA+CHAR(39) if (@cboRelationA !='' ) begin set @TempSql=@TempSql+@cboRelationA+CHAR(32)+@cboFieldB+@cboOperatorB+CHAR(39)+@txtConditionB+CHAR(39) if (@cboRelationB !='') begin set @TempSql=@TempSql+@cboRelationB+CHAR(32)+@cboFieldC+@cboOperatorC+CHAR(39)+@txtConditionC+CHAR(39) end end execute (@TempSql) END
遇到的问题
存储过程建立很简单,但是存储过程调试却有点麻烦,我出过以下两个问题:
问题一:查询时,只识别第一个条件,第二个和第三个条件不识别。
当时我的存储过程是这样的:
if (@cboRelationA !=null ) begin set @TempSql=@TempSql+@cboRelationA+CHAR(32)+@cboFieldB+@cboOperatorB+CHAR(39)+@txtConditionB+CHAR(39) if (@cboRelationB !=null) begin set @TempSql=@TempSql+@cboRelationB+CHAR(32)+@cboFieldC+@cboOperatorC+CHAR(39)+@txtConditionC+CHAR(39) end
问题二:总是报错。
错误显示:
我的存储过程是这样的:
if (@cboRelationA is not null ) begin set @TempSql=@TempSql+@cboRelationA+CHAR(32)+@cboFieldB+@cboOperatorB+CHAR(39)+@txtConditionB+CHAR(39) if (@cboRelationB is not null) begin set @TempSql=@TempSql+@cboRelationB+CHAR(32)+@cboFieldC+@cboOperatorC+CHAR(39)+@txtConditionC+CHAR(39) end end
分析:和最终的存储过程相比,就是判断的条件不同,但是出来的效果很不一样。问题的原因都归结于这
个“Null”值。
关于Null的分析
空集合。
度娘的解释:Null,读音[nʌl]。本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是
在数据库中的NULL:Null在数据库中表示不知道的数据,主要有3种意思:
1)知道数据存在,但不知道具体值.
2)不知道数据是否存在
3)数据不存在.
总结
所以基于对Null值的分析,再回头解释为什么会出现上述的两个问题。
第一个问题分析:在第一种情况下,之所以会出现第二三个条件都不能执行的情况,很明显是没有执行判断下的SQL语句。所以在
数据中判断是否为空,不能用Null。
cmboRelationA(cmboRealtionB)为空,但是SQL语句照常执行,说明对于cmboRelation的限制没有起到作用。第二个问题分析:
而第二种情况,起判断作用的SQL语句执行了,但是因为第二个或者第三个没有输入值,导致出错。即使
存储过程是很方便,但是它的使用也是很不方便的。经过这两天的代码调试,有种历经沧桑的感觉,真的是在调
试中成长的赶脚。