问题的实质:实际的存储过程是实现临时表缓存的唯一机制,还是sp_executeSQL
/ 等系统存储过程sp_execute
也利用了它们?
我不是DBA,所以请少说话。我们的应用程序发送了准备好的语句,这些语句从探查器中运行,我看到它运行所有SQL,sp_prepexec
这是同时运行sp_prepare
和的系统过程sp_execute
。我要尝试做的是弄清楚我是否从临时表缓存中受益。
我一直在使用带有object_id()的本指南来检查行为
https://sqlkiwi.blogspot.com/2012/08/temporary-tables-in-stored-procedures.html
然后,此博客文章上的第3点表明EXEC无法使用临时表缓存,但忽略了sp_executeSQL是否可以:http : //blogs.msdn.com/b/turgays/archive/2013/09/18/exec-vs- sp-executesql.aspx
在通过客户端发送的查询中,我创建了一个简单的临时表。
DECLARE @foo int; -- set by JDBC, unused but required to force a prepared statement
SELECT 1 AS id
INTO #tmp
SELECT OBJECT_ID('tempdb..#tmp');
在探查器中,我可以看到:
declare @p1 int
set @p1=NULL
exec sp_prepexec @p1 output,N'@P1 int',N'declare @foo INT = @P1
SELECT 1 as id
into #tmp
select Object_id(''tempdb..#tmp'');
DROP TABLE #tmp;',1
select @p1
我也从中获得了巨大的成功。但是,临时表的object_id似乎在改变我,如果此临时表是在真正的存储过程中创建的,那不是我看到的行为。但是,当我通过运行相同的代码时sp_executeSQL
,我还看到临时表的object_id已更改。这使我相信只有“真正的”用户创建的存储过程才能利用临时表缓存。