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

Sql server 重复调用存储过程以进行版本比较,sql-server,sql-server-2008,stored-procedures,temp-tables,openrowset,Sql Server,Sql Server 2008,Stored Procedures,Temp Tables,Openrowset,SSMS:2008 R2 我们正在更新我们的软件系统,其中可能包含对数据输入和存储方式的未知数量的未记录更改。我们要求提供文档,但只对数据库的物理更改进行模式比较,而不是数据的处理方式。它们在未来可能会改变,但目前我们不得不假设不会 为了检查存储过程在更新后是否按预期工作,我们希望在更新前后使用参数样本运行一个过程样本,以比较实际数据结果。这里的存储过程都使用单个Id作为参数,用于在软件系统中生成SSRS报告 我已经准备好了一些东西,但是我的方法有问题,我欢迎任何关于更好的方法或者如何修正我的方

SSMS:2008 R2

我们正在更新我们的软件系统,其中可能包含对数据输入和存储方式的未知数量的未记录更改。我们要求提供文档,但只对数据库的物理更改进行模式比较,而不是数据的处理方式。它们在未来可能会改变,但目前我们不得不假设不会

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

我已经准备好了一些东西,但是我的方法有问题,我欢迎任何关于更好的方法或者如何修正我的方法的建议。问题是,只要被调用的存储过程使用临时表,就会返回错误。以下是我所做的:

制作了一个脚本来获取参数ID的随机样本,目前只使用了一个表——这很好

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并比较结果

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

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


关于如何继续,您有什么建议或想法吗?

您可以发布错误详细信息吗?我已经发布了,@Geewers-很好!尝试将Live_Companion.dbo.MyProc的逻辑包装到视图中,然后从视图中选择,而不是执行存储过程。类似于从“++@View_Name+”中选择*,其中MyTableId='+CONVERTVARCHAR50,@MyTableId+”这是一个不错的主意-不幸的是,测试的目的是检查数据的更改是否会影响现有的存储过程,因此,我理想情况下希望能够在未更改的状态下使用存储过程,从而使测试更可靠,而不是测试视图或更改的过程,因为它们可能会对更改做出不同的反应。Live_是当前数据库的名称,还是指代另一个数据库?如果它是当前数据库,请尝试从代码中删除它。如果它引用另一个数据库,请检查您的用户权限或与该数据库的连接。