我有一个存储过程,它创建一些临时表并使用它们运行一些动态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:Starting
和SP: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:忘记提及,此错误仅发生在我的应用程序连续几次调用该过程的第一次执行时。
答案 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正在报告此情况。但是,在实际执行批处理时,表已创建,因此存储过程成功执行。