Mentre la risposta di Brent è corretta per tutti gli scopi pratici, e questo non è qualcosa di cui abbia mai visto qualcuno preoccuparsi, è possibile che più invocazioni di una procedura memorizzata in una sessione si influenzino a vicenda attraverso una tabella #temp nell'ambito della sessione .
La buona notizia è che è estremamente improbabile che accada in natura perché
1) # Le tabelle temporanee dichiarate all'interno di una stored procedure o di lotti nidificati in realtà non hanno visibilità della sessione (o durata). E questi sono di gran lunga il caso più comune.
2) Richiede MultipleActiveResultsets e una programmazione client asincrona molto strana, oppure la procedura memorizzata deve restituire un gruppo di risultati nel mezzo e il client deve chiamare un'altra istanza della procedura memorizzata mentre elabora i risultati dal primo.
Ecco un esempio inventato:
using System;
using System.Data.SqlClient;
namespace ado.nettest
{
class Program
{
static void Main(string[] args)
{
using (var con = new SqlConnection("Server=localhost;database=tempdb;integrated security=true;MultipleActiveResultSets = True"))
{
con.Open();
var procDdl = @"
create table #t(id int)
exec ('
create procedure #foo
as
begin
insert into #t(id) values (1);
select top 10000 * from sys.messages m, sys.messages m2;
select count(*) rc from #t;
delete from #t;
end
');
";
var cmdDDL = con.CreateCommand();
cmdDDL.CommandText = procDdl;
cmdDDL.ExecuteNonQuery();
var cmd = con.CreateCommand();
cmd.CommandText = "exec #foo";
using (var rdr = cmd.ExecuteReader())
{
rdr.Read();
var cmd2 = con.CreateCommand();
cmd2.CommandText = "exec #foo";
using (var rdr2 = cmd2.ExecuteReader())
{
}
while (rdr.Read())
{
}
rdr.NextResult();
rdr.Read();
var rc = rdr.GetInt32(0);
Console.WriteLine($"Numer of rows in temp table {rc}");
}
}
Console.WriteLine("Hit any key to exit");
Console.ReadKey();
}
}
}
quali uscite
Numer of rows in temp table 0
Hit any key to exit
perché la seconda chiamata della procedura memorizzata ha inserito una riga, quindi ha eliminato tutte le righe da #t mentre la prima chiamata era in attesa che il client recuperasse le righe dal suo primo set di risultati. Si noti che se il primo set di risultati fosse piccolo, le righe potrebbero essere memorizzate nel buffer e l'esecuzione potrebbe continuare senza inviare nulla al client.
Se si sposta il
create table #t(id int)
nella procedura memorizzata genera:
Numer of rows in temp table 1
Hit any key to exit
E con la tabella temporanea dichiarata all'interno della procedura, se si cambia la seconda query in
cmd2.CommandText = "select * from #t";
Non riesce con:
'Nome oggetto non valido' #t '.'
Perché una tabella #temp creata all'interno di una stored procedure o di un batch nidificato è visibile solo in quella stored procedure o batch e nelle procedure e batch nidificati che chiama e viene distrutta al termine della procedura o del batch.