I have created a procedure
create procedure testProcedure_One
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into #temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM #temptest
drop table #temptest
end
When I run the procedure testProcedure_One
I am getting the error message:
Invalid object name '#temp'
But if I use ##temp means
it's working:
create procedure testProcedure_two
as
DECLARE @Query nvarchar(4000)
begin
SET @Query = 'SELECT * into ##temptest FROM Table1'
Exec sp_Executesql @query
SELECT * FROM ##temptest
drop table ##temptest
end
testProcedure_two
is working fine
What might be the issue? How can i solve it?
Presumably you have following code that SELECTs from #temp, giving you the error?
It's down to scope. ##temp is a global temporary table, available in other sessions. #temp is "local" temporary table, only accessible by the current executing scope. sp_executesql runs under a different scope, and so it will insert the data into #temp, but if you then try to access that table outside of the sp_executesql call, it won't find it.
e.g. This errors as #Test is created and only visible to, the sp_executesql context:
EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test'
SELECT * FROM #Test
The above works with ##Test as it creates a global temporary table.
This works, as the SELECT is part of the same scope.
EXECUTE sp_executesql N'SELECT 1 AS Field1 INTO #Test; SELECT * FROM #Test'
My questions would be:
Create the Temporary table by using CREATE TABLE and then use INSERT INTO to insert the values instead of SELECT INTO.
This rectified the problem for me.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With