Unit testing 在SQLServer中测试存储过程

Unit testing 在SQLServer中测试存储过程,unit-testing,testing,sql-server-2012,Unit Testing,Testing,Sql Server 2012,我编写了一个存储过程来测试另一个存储过程,方法是传递不同的参数,并将执行该过程所花费的计数和时间存储在temp表中。程序比函数好吗 CREATE PROCEDURE [dbo].[SPTEST_NEW] AS BEGIN DECLARE @COUNT INT; DECLARE @STARTDATETIME DATETIME; DECLARE @ENDDATETIME DATETIME; DECLARE @TimeDiff NVARCHAR(50); D

我编写了一个存储过程来测试另一个存储过程,方法是传递不同的参数,并将执行该过程所花费的计数和时间存储在temp表中。程序比函数好吗

CREATE PROCEDURE [dbo].[SPTEST_NEW] 
AS 
BEGIN
    DECLARE @COUNT INT;
    DECLARE @STARTDATETIME DATETIME;
    DECLARE @ENDDATETIME DATETIME;
    DECLARE @TimeDiff NVARCHAR(50);
    DECLARE @SPNAME VARCHAR(50);

    DECLARE @Result TABLE
                    (
                        Cases NVARCHAR(100),
                        RecordCount INT,
                        ExecutionTime NVARCHAR(50)
                    )
    DECLARE @Search TABLE
                    (
                        ID NVARCHAR(50),
                        NAME NVARCHAR(200),
                        FMT NVARCHAR(100)
                    )

     SET @SPNAME = 'dbo.[SEARCH_VALUE]'; 
     SET @STARTDATETIME = GETDATE();

     --Case#1: Search by All
     INSERT INTO @Search
         EXEC @SPNAME @PRODUCTID = NULL,
                      @PRODUCTNAME = NULL,
                      @FORMAT = NULL

     SET @ENDDATETIME = GETDATE();  
     SELECT @COUNT= @@ROWCOUNT

     SET @TimeDiff = CONVERT(TIME, @ENDDATETIME - @STARTDATETIME);

     INSERT INTO @Result 
     VALUES ('ALL', @COUNT, @TimeDiff)

     -- Case#2 : Search by Product-ID
     INSERT INTO @Search
         EXEC @SPNAME
                   @PRODUCTID = 'ABPROD-BLACK',
                   @PRODUCTNAME = NULL,
                   @FORMAT = NULL,

      SET @ENDDATETIME = GETDATE();
      SELECT @COUNT = @@ROWCOUNT

      SET @TimeDiff = CONVERT(TIME, @ENDDATETIME - @STARTDATETIME);

      INSERT INTO @Result 
      VALUES ('PROD-ID:ABPROD-BLACK', @COUNT, @TimeDiff)

      --Case#3 : Search by FORMAT
      INSERT INTO @Search
          EXEC @SPNAME
                   @PRODUCTID = NULL,
                   @PRODUCTNAME = NULL,
                   @FORMAT = 'SCHT',

      SET @ENDDATETIME = GETDATE();
      SELECT @COUNT= @@ROWCOUNT

      SET @TimeDiff = CONVERT(TIME, @ENDDATETIME - @STARTDATETIME);

      INSERT INTO @Result 
      VALUES ('Format:SCHT', @COUNT, @TimeDiff)

      SELECT * 
      FROM @Result
END
这个方法正确吗?还是其他方法?请推荐该方法。

如果您确实想要良好的时间测量-不要使用
DATETIME
-它的精度仅为3.33ms。使用精确到100ns的
TIME(7)
(或
DATETIME2(7)
),您应该定义“更好”,它们有两个不同的用途。函数基本上是一个带有参数的视图,可以慢一些,但可以在连接中使用。存储过程可以使用可重用的执行计划进行编译,这将在很多情况下产生更好的性能。