问题
当待测试存储过程返回SQL行集的时候,如何判断测试结果是否通过。
设计
首先,创建一个临时数据库表,然后,调用待测存储过程并取回返回的行数,把它放到临时表里,计算临时表的聚合校验和(aggregate checksum),并把这个值与期望的校验值进行比较。
方案
设想有一个名为usp_HireAfter()的待测存储过程,它接受一个日期作为输入参数。这个存储过程从雇用日期晚于输入日期的那些记录表里选出所有的employee列(empID、empLast、empDOH):
create procedure usp_HiredAfter @dt datetime as select * from tb1Employees where empDOH > @dt |
首先,应该创建一个临时表,用于保存存储过程返回的SQL行集:
create table #results ( empID char(3) primary key, empLast varchar(35) not null, empDOH datetime not null ) |
注意:表名之前的#字符是用来表示这是一个临时表,然后可以调用待测存储过程并且把返回的行集存入临时表:
insert @results(empID,empLast,empDOH) exec dbEmployees.dbo.usp_HiredAfter '10/25/2009' |
接下来,计算临时表聚合校验和,并把实际值与期望值进行比较:
if(@@rowcount = 0) set @actual = 0 else select @actual = checksum_agg(binary_checksum(*)) from #results if(@actual = 25527856) print 'Pass' else print 'FAIL' |
内建的SQL binary_checksum()函数返回SQL表里某一行的校验和。可以把它想象成用来代表某一行字符数据的一个整数值。checksum_agg()函数返回某一组值的聚合校验和。当它们一起使用时,其计算结果是一个胜于表征某个行值的整数值。