Bisakah dua sesi membuat tabel #temp dengan nama yang sama?


16

Saya membuat tabel sementara ( #myTable) dan menggunakan kursor. Apakah ini menimbulkan masalah ketika pengguna secara bersamaan mengakses kursor melalui aplikasi saya? Apakah itu memungkinkan saya untuk membuat tabel temp terpisah dengan nama yang sama?

Berikut ini adalah kode sampel:

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 

Jawaban:


20

SQL server selalu menambahkan beberapa nomor acak di akhir nama tabel temp (di belakang layar), ketika pengguna bersamaan membuat tabel temp di sesi mereka dengan nama yang sama, sql server akan membuat beberapa tabel temp di tempdb.

Saya membuat 3 tabel temp yang disebut #TempTabledalam tiga sesi berbeda di SSMS saya, sekarang jika saya pergi ke tempdb saya bisa melihat tabel temp dibuat di sana dengan string acak (unik) ditambahkan ke nama masing-masing tabel temp.

masukkan deskripsi gambar di sini


11

Ya, banyak aplikasi akan mendapatkan salinan tabel #temp mereka sendiri. Itulah gunanya menggunakan tabel #temp, karena setiap sesi bersamaan memiliki objek mereka sendiri yang terisolasi. Ini tidak ada hubungannya dengan apakah Anda menggunakan kursor dalam kombinasi dengan tabel #temp Anda (meskipun saya curiga kursor tidak diperlukan - Anda tidak memasukkan cukup kode untuk berkomentar secara spesifik).

Edit untuk memasukkan komentar:

Satu hal tambahan tentang penggunaan tabel #temp adalah bahwa jika Anda perlu menambahkan batasan padanya biarkan SQL server menghasilkan nama sebaliknya, meskipun tabel tersebut akan unik untuk sesi tersebut, kendala tidak akan dan contoh kedua akan membuat kesalahan menciptakan meja.


7
Satu hal tambahan tentang penggunaan tabel #temp adalah bahwa jika Anda perlu menambahkan batasan padanya biarkan SQL server menghasilkan nama sebaliknya, meskipun tabel tersebut akan unik untuk sesi tersebut, kendala tidak akan dan contoh kedua akan membuat kesalahan menciptakan meja.
Aaron

1
@ Harun - Sarankan agar Anda memindahkan komentar pada kendala yang tidak disebutkan namanya menjadi jawabannya. Banyak orang mengacaukan detail itu.
RLF

Juga mencatat bahwa jika seseorang tidak ingin tabel temp global, mereka bisa menyatakan itu ##likeThis.
underscore_d

@RLF dan Aaron: seseorang selalu dapat menghasilkan GUID dengan NEWID () dan membuat batasan melalui Dynamic SQL. Tidak mengatakan itu sebersih termasuk dalam pernyataan CREATE TABLE, tetapi setidaknya merupakan opsi. Dan saya juga percaya bahwa batasan FK tidak diperbolehkan pada tabel temp (selama kita berbicara tentang batasan secara umum).
Solomon Rutzky

@srutzky - Benar, tetapi batasan yang dinamai biasanya dinamai untuk memudahkan referensi mereka dari kode. Menggunakan NEWID () tidak akan memberikan penyederhanaan itu, meskipun Anda dapat meminta untuk menemukan NEWID jika diperlukan.
RLF
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.