İki oturum aynı ada sahip #temp tabloları oluşturabilir mi?


17

Geçici bir tablo ( #myTable) oluşturuyorum ve bir imleç kullanıyorum. Eşzamanlı kullanıcılar uygulamam üzerinden imlece erişirken bu bir sorun yaratır mı? Aynı ada sahip ayrı geçici tablolar oluşturmama izin veriyor mu?

Örnek kod aşağıdadır:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 

Yanıtlar:


20

SQL sunucusu her zaman geçici tablo adının sonuna (sahnelerin arkasında) rastgele bir sayı ekler, eşzamanlı kullanıcılar aynı adla oturumlarında geçici tablolar oluşturduğunda, sql sunucusu tempdb'de birden fazla geçici tablo oluşturur.

#TempTableSSMS'mde üç farklı oturumda adlandırılan 3 geçici tablo oluşturdum , şimdi tempdb'ye gidersem orada oluşturulan geçici tabloları her geçici tablonun adına eklenen rastgele (benzersiz) bir dize ile görebiliyorum.

resim açıklamasını buraya girin


11

Evet, birden fazla uygulama #temp tablosunun kendi kopyalarını alacaktır. Bir #temp tablosu kullanmanın anlamı budur, çünkü her eşzamanlı oturumun kendi yalıtılmış nesnesi vardır. Bu, #temp tablonuzla birlikte bir imleç kullanıp kullanmadığınızla ilgisi yoktur (yine de imlecin gerekli olmadığından şüpheleniyorum - özellikle yorum yapmak için yeterli kod eklemediniz).

Yorum eklemek için düzenleyin:

#Temp tablolarını kullanma hakkında ek bir şey, eğer onlara kısıtlamalar eklemeniz gerekiyorsa, SQL sunucusunun adı oluşturmasına izin verin, aksi takdirde tablo oturum için benzersiz olsa da kısıtlama olmaz ve ikinci örnek tablo.


7
#Temp tablolarını kullanma hakkında ek bir şey, onlara kısıtlamalar eklemeniz gerekiyorsa, SQL sunucusunun adı oluşturmasına izin verin, aksi takdirde tablo oturum için benzersiz olsa da, kısıtlama olmaz ve ikinci örnek tablo.
Aaron

1
@Aaron - Adsız kısıtlamalar hakkındaki yorumu cevaba taşımanızı öneririz. Birçok kişi bu ayrıntıyı karıştırıyor.
RLF

Ayrıca , bir kişi genel bir geçici tablo istiyorsa, bunu bildirebileceğini unutmayın ##likeThis.
underscore_d

@RLF ve Aaron: Kişi her zaman NEWID () ile bir GUID oluşturabilir ve Dynamic SQL ile kısıt oluşturabilir. Bunun CREATE TABLE ifadesine eklemek kadar temiz olduğunu söylememekle birlikte, en azından bir seçenektir. Ayrıca geçici kısıtlamalarda FK kısıtlamalarına izin verilmediğine inanıyorum (kısıtlamalardan genel olarak bahsettiğimiz sürece).
Solomon Rutzky

@srutzky - Doğru, ancak adlandırılmış kısıtlamalar genellikle koddan referans almayı kolaylaştırmak için adlandırılır. Bir NEWID () kullanmak bu basitleştirmeyi sağlamaz, ancak gerekirse NEWID'yi bulmak için sorgulayabilirsiniz.
RLF
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.