【发布时间】:2016-03-15 15:44:10
【问题描述】:
能否请 tSQLt 专家加入测试一种不返回任何内容但在表中执行字段更新的存储过程的方法?我了解如何测试函数或 SP 返回的结果,但在就地更新的情况下,如果该过程,我如何使测试针对假表与实际表运行表名有硬编码吗?我能想到的唯一办法就是让整个SP使用动态SQL,并把表名作为参数传进去,但是这样会让代码的可读性变差,更脆。有没有更好的办法?下面是一个简单的存储过程,它查看另外两个字段:TransactionDate 和 ENdOfDropDate,并根据条件的结果将同一个表中名为“IsWithinAddDrop”的第三个字段设置为 True 或 False。
create table tblT1
(
ID [bigint] IDENTITY(1,1) NOT NULL,
TransactionDate [datetime2](7) NULL,
EndOfDropDate [datetime2](7) NULL,
IsWithinAddDrop [nvarchar](10) NULL
)
insert into tblT1 (TransactionDate, EndOfDropDate) values ('1/1/2016', '2/1/2016')
insert into tblT1 (TransactionDate, EndOfDropDate) values ('2/1/2016', '1/2/2016')
insert into tblT1 (TransactionDate, EndOfDropDate) values ('3/1/2016', '3/1/2016')
create procedure spUpdateIsWithinAddDrop
as
begin
Update t1
set t1.IsWithinAddDrop =
(case
when t1.TransactionDate <= t1.EndOfDropDate then 'True'
else 'False'
end)
from tblT1 t1
end
exec spUpdateIsWithinAddDrop
结果是我要测试的表中更新的 IsWithinAddDrop 列:
TransactionDate EndOfDropDate IsWithinAddDrop
2016-01-01 2016-02-01 True
2016-02-01 2016-01-02 False
2016-03-01 2016-03-01 True
谢谢!
【问题讨论】:
-
通常测试此类过程的最佳方法是制作目标表 (t1) 的较小副本,并将过程设置为在副本上执行。我还看到这种情况发生在更大的规模上,其中将创建和填充整个数据库以测试单个批处理作业。
标签: tsql testing stored-procedures tsqlt