0

我想知道你们中的任何人是否可以帮助我提出想法。你看,我正在调整一个存储过程,称之为 proc1,它在内部调用一个表函数。该过程有一个表输入参数(idk 为什么,但它是这样构建的),然后它执行表函数:

调用前端正在执行的过程:

declare @p3 dbo.tblType

insert into @p3 
values( 11 , 1 , 2 , 5 , 0 , 0 , 0 , 0 , 0 , 'true', 'test')

exec sp_executesql N'proc1 @tblSearch',N'@tblSearch [dbo].[tblType] READONLY',@tblSearch=@p3

在过程中调用表函数。

INSERT INTO #TempTable 
    SELECT * 
    FROM Func1(@Param1, @Param2,@Param3)

令人毛骨悚然的是,我调整了表函数以减少执行时间,但是,它所采取的过程大致相同。然后我试图找出问题并简化问题。最后,我将表函数的原始执行与值放在一起。它可以工作。所以如果程序得到了这个,它会在 1 秒内执行,但如果我用变量改变它,它需要很长时间(8 分钟)。我多次检查并验证我绑定的值与我输入的值相同。

光速执行:

SELECT * 
FROM [dbo].[Func1] (11,1,2,5,0,0,0,0,0,0) 
ORDER BY 1

蜗牛执行缓慢:

SELECT *  
FROM [dbo].[Func1] (@IDa, @IDb, @OtherActionId, @Idc, @IDd, @IDe, @IDf, @IDg, @IDh, @IDi) 
ORDER BY 1

这个问题快把我逼疯了,太疯狂了。为什么同一个电话有如此不同的时间?只是在一个中,我输入了值,我发誓我验证了输入参数,我在执行之前放置了以下语句,所以我知道它们:

SELECT @IDa '@IDa',@IDb '@IDb',@OtherActionId '@OtherActionId',@Idc '@Idc',@IDd '@IDd',@IDe '@IDe',@IDf '@IDf',@IDg '@IDg',@IDh '@IDh',@IDi '@IDi'

任何想法?也许与sp_executesql?有没有人有类似的问题?

在此先感谢和亲切的问候!

4

0 回答 0