我遇到了一个由传递给动态SQL的参数引起的奇怪问题。
动态SQL有完整的参数,如下所示:
SET @sql = @sql + N'AND (Book.ID = @paramBookID) '
IF (NOT @AuthorID IS NULL)
SET @sql = @sql + N'AND (Book.AuthorID = @paramAuthorID) '
然后我将参数传递给sp_executeSql调用,如下所示:
-- Execute the parameterized dynamic SQL query
DECLARE @params NVARCHAR(500) = N'@paramBookID int, @paramAuthorID int'
EXEC sp_executesql @sql, @params,
@paramBookID = @BookID,
@paramAuthorID = @AuthorID
动态查询非常慢,起初我认为是导致问题的动态SQL执行,所以我创建了动态SQL并将其复制到SSMS。 然后我在查询的顶部声明了所有变量并且执行得更快(大约一秒钟,而不是1分钟以上) 然后我做了一些更多的摆弄,并替换了一个变量实际值变量的行:
替换:AND(Book.AuthorID = @paramAuthorID)
使用:AND(Book.AuthorID = 1471409)
查询开始再次运行缓慢。 不知道为什么这会导致问题并使查询运行得如此之慢。 我甚至试过这个:
AND(Book.AuthorID = CAST(1471409 AS INT))
因为我觉得这可能是某种打字问题,但这也没有帮助,它仍然运行缓慢, 所以最后我最终对动态sql进行了一些修改,将所有参数复制到动态SQL中的局部变量中:
SET @sql =
N'DECLARE @BookId INT = @paramBookID ' +
N'DECLARE @AuthorID INT = @paramAuthorID ' +
@sql
查询现在运行速度更快,我仍然没有解释为什么。 有没有人对我偶然发现的这个奇怪的解决方案有任何见解?