Sql rpc和sp启动之间的对象名temp无效

Sql rpc和sp启动之间的对象名temp无效,sql,sql-server,Sql,Sql Server,我有一个存储过程,它创建一些临时表并使用它们运行一些动态sql 我首先创建临时表,然后插入它们,然后运行exec@sql那是指他们 我正在构建的应用程序使用此进程连续调用它几次。我追踪了一下,发现了一些我不明白的东西。我正在研究RPC:Starting、RPC:Completed、SP:Starting、SP:Completed和异常。跟踪结果如下所示: RPC:Starting exec my_proc Exception Invalid object name '#temp

我有一个存储过程,它创建一些临时表并使用它们运行一些动态sql

我首先创建临时表,然后插入它们,然后运行exec@sql那是指他们

我正在构建的应用程序使用此进程连续调用它几次。我追踪了一下,发现了一些我不明白的东西。我正在研究RPC:Starting、RPC:Completed、SP:Starting、SP:Completed和异常。跟踪结果如下所示:

RPC:Starting    exec my_proc
Exception       Invalid object name '#temp'. --a few of these
SP:Starting     exec my_proc
SP:Completed    exec my_proc
RPC:Completed   exec my_proc
一切正常,我只是对RPC:Starting和SP:Starting之间的异常情况感到困惑。有人能解释一下吗?我的印象是直到SP:启动,我的程序才开始

创建表temp1 test INT的Edit:Exception的时间戳、SP:start和SP:stmtstart都是相同的。语句插入temp1…,是.003秒之后

整个程序的简化版本为:

...AS
CREATE TABLE #temp1 
(test INT)

INSERT INTO #temp1
SELECT some_numbers
FROM some_table

--Simplification, but same premise,
--Concatenate a partial statement with result from querying the #temp table
DECLARE @sql VARCHAR(MAX) = 
'CREATE VIEW ['+@someName+'] AS SELECT '+SELECT test FROM #temp1+' FROM some_other_table'

DROP TABLE #temp1

BEGIN TRY
    exec(@sql)
END TRY
BEGIN CATCH
END CATCH

编辑2:忘了提一下,这个错误只发生在程序第一次执行时,我的应用程序连续调用它几次

我认为问题在于您过早地放弃了表temp1。下面是一个稍微简化的代码版本:

CREATE TABLE #temp1 
(test INT)

INSERT INTO #temp1
SELECT 1
FROM sometable

--Simplification, but same premise,
--Concatenate a partial statement with result from querying the #temp table
DECLARE @sql VARCHAR(MAX) = 
'CREATE VIEW etc AS SELECT test FROM #temp1 '

BEGIN TRY
    exec(@sql)
END TRY
BEGIN CATCH
END CATCH

select * from #temp1
DROP TABLE #temp1

请注意,视图有一个名称,并且在执行动态SQL查询后会移动DROP表。

您的代码实际上没有问题,错误可以忽略


这是因为SQL Server的一个功能名为。编译批处理时,temp1表不存在-探查器正在报告此情况。但是,在实际执行批处理时,表已经创建,因此存储过程成功执行。

如果您告诉我们sp_启动和异常之间的时间戳是否相同,我猜它们是相同的,并且异常会以更高的优先级被清除,这将很有帮助,你正在执行的代码,所以我们知道proc是否有问题。在这里键入该部分时,在视图名称上删除了,它在proc中有一个名称。至于删除时间,我按照您的建议移动了它,但我仍然看到了相同的错误。很可能呈现的代码没有掌握整个流程。您可以尝试以下操作:在输入“开始尝试”之前,从temp1中选择*。然后,在您的捕获中打印@错误以允许从SSMS运行,并比在您的探查器中更好地查看此类错误,因为您可以进行打印并选择以准确地知道失败的位置。我会尝试一下,但当我在SSMS中运行它时,仅当我运行应用程序时,并且仅在几次运行的第一次运行时,proc不会显示任何错误。它成功地完成了每次运行,生成了我想要的视图。只是我不知道这些例外是从哪里来的。。END CATCH可确保从SQL到您的应用程序不会出现任何错误,这就是为什么在其中添加打印可能有助于解开谜团的原因:。