重复调用存储过程以进行版本比较

时间:2015-05-12 14:27:05

标签: sql-server sql-server-2008 stored-procedures temp-tables openrowset

SSMS:2008 R2

我们正在更新我们的软件系统,其中可能包含未知数量的未记录更改数据输入和存储在我们的数据库中的方式。我们已经要求提供文档,但只有#34; physical"对数据库的更改,而不是数据的处理方式。他们将来可能会改变,但现在我们不得不假设。

为了在更新后检查我们的存储过程是否按预期工作,我们希望在更新之前和之后使用参数样本运行过程示例,以比较实际数据结果。这里的存储过程都将一个Id作为参数(它们用于在软件系统中生成SSRS报告)

我已经设定了一些内容,但我的方法存在问题,并欢迎任何有关更好的做事方式或如何修复方法的建议。问题是只要被调用的存储过程使用临时表,就会返回错误。这就是我所做的:

制作一个脚本来获取一个随机的IDS样本(目前只使用一个表 - 这很好)。

ALTER PROC [dbo].[UpdateValidation_GET_RandomIdSample](@TestSizePercent DECIMAL(6,3))
AS
-- This table is already created and will persist both sides of the update
--CREATE TABLE Live_Companion.dbo.UpdateValidationIds
--( Id          INT IDENTITY(1,1)NOT NULL PRIMARY KEY CLUSTERED
-- ,MyTableId   NT               NULL)

IF @TestSizePercent > 100 RAISERROR('Do you even percent, bro?',16,1)
DECLARE @SQL VARCHAR(255)
TRUNCATE TABLE UpdateValidationIds

SET @SQL =
'INSERT dbo.UpdateValidationIds(Id)
SELECT TOP ' + CONVERT(VARCHAR(10),@TestSizePercent) + ' PERCENT ID FROM Live.dbo.MyTable ORDER BY NEWID()'
EXEC (@SQL)

制作第二个脚本,为表中的每个Id运行存储过程:

ALTER PROC [dbo].[UpdateValidation_GET_ProcedureResultsManyTimes](@Procedure_Name VARCHAR(255))
AS

--DECLARE @Procedure_Name VARCHAR(255) = 'Live_Companion.dbo.MyProc'

DECLARE @ID INT
DECLARE @GET_ID CURSOR
DECLARE @SQL VARCHAR(MAX) = ''
DECLARE @MyTableId INT
DECLARE @FirstRun BIT = 1
SET @GET_ID = CURSOR FOR
    SELECT Id FROM Live_Companion.dbo.UpdateValidationIds
    WHERE MyTableId IS NOT NULL
OPEN @GET_ID
FETCH NEXT FROM @GET_ID INTO @ID
WHILE @@FETCH_STATUS = 0
BEGIN
    SELECT @MyTableId = MyTableId FROM Live_Companion.dbo.UpdateValidationIds
    WHERE Id = @ID

    IF @FirstRun = 1
    BEGIN
        SET @SQL = 'SELECT * INTO #ProcedureOutput FROM OPENROWSET(''SQLNCLI'',''Server=SQL1;Trusted_Connection=yes;'',''EXEC ' + @Procedure_Name + ' ' + CONVERT(VARCHAR(50),@MyTableId) + ''');'
        SET @FirstRun = 0
    END
    ELSE
    BEGIN
        SET @SQL = @SQL + '
        INSERT #ProcedureOutput SELECT * FROM OPENROWSET(''SQLNCLI'',''Server=SQL1;Trusted_Connection=yes;'',''EXEC ' + @Procedure_Name + ' ' + CONVERT(VARCHAR(50),@MyTableId) + ''');'
    END
    FETCH NEXT FROM @GET_ID INTO @ID
END

SET @SQL = @SQL + '
SELECT * FROM #ProcedureOutput
DROP TABLE #ProcedureOutput'
EXEC (@SQL)

CLOSE @GET_ID
DEALLOCATE @GET_ID

所以现在我应该能够为各种存储过程执行第二个过程并将结果输出到一系列ID上的文件,然后在更新后再次使用保存的(最初随机的)ID并比较结果。 / p>

问题是,当任何被调用的过程使用临时表时,它会失败: 编辑: 返回错误消息:

  

无法处理对象" EXEC Live_Companion.dbo.MyProc 12345"。该   OLE DB提供程序" SQLNCLI10"对于链接服务器"(null)"表明   对象没有列或当前用户没有   该对象的权限。

有关如何进行的任何建议或想法?

0 个答案:

没有答案