【机房收费系统】——存储过程

最近敲的组合查询,用到了存储过程,遇到了很多问题,现在写出来与大家分享。


存储过程建立


存储过程的建立很简单,在数据库中的可编译性下的存储过程中直接新建就可以了。
【机房收费系统】——存储过程_第1张图片
或者新建查询,输入存储过程对应的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

问题二:总是报错。

错误显示:

【机房收费系统】——存储过程_第2张图片

我的存储过程是这样的:

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。

第二个问题分析:

而第二种情况,起判断作用的SQL语句执行了,但是因为第二个或者第三个没有输入值,导致出错。即使

cmboRelationA(cmboRealtionB)为空,但是SQL语句照常执行,说明对于cmboRelation的限制没有起到作用。

存储过程是很方便,但是它的使用也是很不方便的。经过这两天的代码调试,有种历经沧桑的感觉,真的是在调

试中成长的赶脚。

你可能感兴趣的:(【机房收费系统】——存储过程)