Tabelele temporare globale sunt vizibile în toate sesiunile. Tabelele temporare globale sunt șterse automat la încheierea sesiunii. crearea unei mese și oprirea tuturor celorlalte sarcini de a le aborda. Cum pot utiliza o tabelă globală temporară dintr-o altă sesiune? De exemplu, într-o procedură stocată, a fost creată o tabelă globală temporară, iar datele au fost plasate în acest tabel, iar din alte proceduri este accesată o tabelă temporară globală
Referindu-ne la tabelul temporar global dintr-o altă procedură:
Este posibil deloc? Dacă nu, există alte soluții? Sau poate este posibil să vă asigurați că tabelul nu este șters la sfârșitul sesiunii?
presetate 9 Mar '16 la 14:37
Tabelele temporare globale sunt șterse automat când se încheie sesiunea care a creat tabelul și toate celelalte activități sunt întrerupte.
Așa e. Dacă tabelul ## este creat într-o singură sesiune și este accesat din alte sesiuni, atunci este disponibil în ele până când prima sesiune este închisă sau dacă ## tabelul este accesat din aceste alte sesiuni. Și este important, dacă există referințe la un moment dat de timp și dacă vor fi ceva mai târziu.
Cum funcționează acest lucru poate fi văzut în exemplul următor. Să creați două sesiuni în același timp.
și lăsați această sesiune deschisă pentru moment.
Obținem datele pe care le-am completat în Sesiunea 1, așa cum era de așteptat. Acum, în Sesiunea 2, efectuați:
acest lucru va cauza o blocare ## t (același "este un apel").
Sesiunea 1 este acum închisă, iar în Sesiunea 2 executăm:
Deși Session 1, în care a fost creat tabelul ##, este deja închis, primul eșantion va avea succes, deoarece ## t a fost capturat de noi în Sesiunea 2. După încheierea tranzacției (COMMIT) în Sesiunea 2, ## t este eliberat. ci pentru că initiatorul sesiunii este deja inchis, atunci ## t va fi sters imediat. În consecință, al doilea eșantion se va încheia cu o eroare.
Cum pot utiliza o tabelă globală temporară dintr-o altă sesiune?
Din moment ce faceți acest lucru, dar, după cum puteți vedea din exemplul de mai sus, există câteva nuanțe legate de ciclul de viață al tabelelor.
În funcție de situație, sunt posibile următoarele opțiuni:
- Păstrați sesiunea care a creat tabela ## deschisă pentru durata accesării acesteia din alte sesiuni. Aceasta este probabil cea mai simplă și mai puțin problematică opțiune, dacă, desigur, arhitectura aplicației permite utilizarea acesteia.
- Puteți crea un tabel ## într-o singură sesiune, apoi capturați-o într-o altă sesiune, setând o blocare acceptabilă, după care sesiunea care a creat tabela ## poate fi închisă.
- În unele cazuri, logica aplicațiilor vă poate permite să faceți o validare a existenței / creării / completării unui tabel ## în fiecare sesiune, dacă este necesar. În acest caz, codul de inițiere poate fi pus într-o procedură separată și executat după cum este necesar în fiecare astfel de sesiune.
- Dacă opțiunile de mai sus nu sunt potrivite, atunci acesta poate fi un semn că cu ## tabele încercați să rezolvați o problemă pe care ar trebui să o rezolvați folosind tabele persistente.
- Există, de asemenea, o alternativă între ## și tabelele constante - aceasta creează tabele permanente în tempdb (acestea vor exista până la următorul restart SqlServer). Cu toate acestea, personal, această metodă mi se pare "murdară".
răspunsul dat 10 Mar '16 la 7:30 am