rpc和sp之间的无效对象名称#temp

时间:2016-03-14 16:01:55

标签: sql sql-server

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

我首先创建临时表,然后插入它们,然后运行引用它们的exec(@sql)。

我正在构建使用此proc的应用程序连续几次调用它。我追踪它,看到了一些我不明白的东西。我正在看RPC:Starting,RPC:Completed,SP:Starting,SP:Completed和Exceptions。跟踪看起来像这样:

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:StartingSP:Starting之间的例外情况感到困惑。有人可以解释一下吗?我的印象是我的程序直到SP开始才开始。

编辑:异常的时间戳,SP:开始,以及SP:CREATE TABLE #temp1 (test INT)的StmtStarting都是相同的。声明INSERT INTO #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:忘记提及,此错误仅发生在我的应用程序连续几次调用该过程的第一次执行时。

2 个答案:

答案 0 :(得分:0)

我认为问题是你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 太快了。您的代码的略微简化版本如下:

DROP TABLE

请注意,该视图有一个名称,dynamic SQL query执行后会移动mapView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return true; } });

答案 1 :(得分:0)

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

之所以发生这种情况,是因为有一种称为Deferred Name Resolution的SQL Server功能。在编译批处理时,#temp1表不存在-Profiler正在报告此情况。但是,在实际执行批处理时,表已创建,因此存储过程成功执行。