存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。
在组合查询中用到了存储过程,遇到了一堆错误。经过小伙伴儿们的帮忙,和艰苦的调试,终于调出了错误。
调试完错误后的存储过程是这样的:(在主程序调用前要把参数的初始值去掉,由程序中获得,测试为了方便才如此做)
USE [RoomCharge] GO /****** Object: StoredProcedure [dbo].[PROC_CombinedQuery] Script Date: 11/13/2015 19:40:04 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: 李爽 -- Create date: 2015-11-10 -- Description: 实现组合查询,学生上机记录查询,教师工作记录查询和学生基本信息维护 -- ============================================= ALTER PROCEDURE [dbo].[PROC_CombinedQuery] -- Add the parameters for the stored procedure here @DbName nvarchar(50)='stuOnlineRecord_Info', @cboFileName1 nvarchar(20)='StudentName', @cboOperator1 nvarchar(10)='=', @txtContent1 nvarchar(20)='1', @cboRelation1 nvarchar(10) = '', @cboFileName2 nvarchar(20)='CardNo', @cboOperator2 nvarchar(10)='=', @txtContent2 nvarchar(20)='1', @cboRelation2 nvarchar(10)='and', @cboFileName3 nvarchar(20)='StudentNo', @cboOperator3 nvarchar(10)='=', @txtContent3 nvarchar(20)='1' AS declare @TempSql varchar(500)--临时存放sql语句 --CHAR(32)是空格,CHAR(39)单引号 begin --一个条件查询 set @TempSql ='select * from ' +@DbName+' where'+char(32)+ @cboFileName1+@cboOperator1 +char(39)+@txtContent1 +char(39) if(@cboRelation1 != null) begin --两个条件查询 set @TempSql =@TempSql +char(32) +@cboRelation1 +char(32)+@cboFileName2 +@cboOperator2 +char(39)+@txtContent2 +char(39)if(@cboRelation2 != null) begin --三个条件查询 set @TempSql =@TempSql +char(32)+@cboRelation2+char(32)+@cboFileName3 +@cboOperator3 +char(39)+@txtContent3 +char(39)endendexecute (@Tempsql) --执行查询语句 end
1、存储过程中SQL语句的小标点,万万大意不得。
正确写法:
@TempSql='select * from ' +@DbName+' where'+char(32)+@cboFileName1+@cboOperator1+char(39)+@txtContent1 +char(39)
注意:from右边和where左边均有一个空格,必不可少。
错误写法:
@TempSql='select * from'+char(39)+@DbName+char(39)+'where'+char(32)+@cboFileName1+@cboOperator1 +char(39)+@txtContent1 +char(39)
注意:在单引号的句子中的单引号外不可以再用char(32)等ascii码。而应该向正确写法一样用单引号里边的空格。当然单引号内部不可以用ascii过程中SQL语句的小标点码。
2、存储过程中空值Null
Isnot Null(is null) VS !=null(=null)
is null:用来确定表达式是否为Null
=null:用来确认参数是否为Null
--给参数赋值: @cboRelation1=''--(1)表示参数是null @cboRelation1=null --(2)表示参数是null @cboRelation1 is not null --(3)会有语法错误 --判断参数是否符合条件 if(@cboRelation1 is not null) --在(1)的参数情况下会有语法错误,在(2)的参数情况下可以执行。(这里表示判断表达式是否为空) if(@cboRelation1 != null) --在(1)(2)的参数情况下都可以执行。(在这里表示判断参数值是否为空)