Tabel SQL Server: apa perbedaan antara @, # dan ##?

90

Di SQL Server, apa perbedaan antara tabel @, tabel # dan tabel ##?

Craig Schwarze
sumber

Jawaban:

114

#table mengacu pada tabel sementara lokal (hanya dapat dilihat oleh pengguna yang membuatnya).

##table mengacu pada tabel sementara global (dapat dilihat oleh semua pengguna).

@variableName mengacu pada variabel yang dapat menyimpan nilai tergantung pada tipenya.

Arnkrishn
sumber
31
Definisi Anda tentang #table tidak sepenuhnya benar. Ini tidak terbatas pada pengguna melainkan koneksi. Jika pengguna memiliki banyak koneksi, itu hanya akan terlihat oleh koneksi yang membuat #tabel sejak awal.
Davin Studer
@DavinStuder telah menawarkan klarifikasi penting. Perbedaan antara tabel yang terlihat oleh pengguna vs. tabel yang hanya terlihat pada koneksi saat ini sangat penting.
mirzmaster
@DavinStuder bagaimana melihat beberapa koneksi untuk pengguna? string koneksi yang sama?
Kiquenet
24

Silahkan lihat

Adriaan Stander
sumber
4
Saya menyadari ini sudah lama sekali, tetapi karena ini adalah jawaban hanya-tautan (dan tautan pertama sudah mati), dapatkah itu diperbarui dengan kesimpulan utama dari masing-masing tautan?
Mike Guthrie
7

#dan ##tabel adalah tabel aktual yang direpresentasikan dalam database temp. Tabel ini dapat memiliki indeks dan statistik, dan dapat diakses di seluruh sprocs dalam satu sesi (dalam kasus tabel temp global, ini tersedia di seluruh sesi).

@Table adalah variabel tabel.

Untuk lebih lanjut: http://www.sqlteam.com/article/temporary-tables

perengek
sumber
4
Dan variabel tabel juga akan hidup di database tempDB, jika ukurannya terlalu besar untuk disimpan di memori.
marc_s
5

Saya akan fokus pada perbedaan antara #table dan @table. ## tabel adalah tabel sementara global dan sebagai catatan selama lebih dari 10 tahun menggunakan SQL Server, saya belum menemukan kasus penggunaan yang valid. Saya yakin bahwa beberapa ada tetapi sifat objek membuatnya sangat tidak dapat digunakan IMHO.

Tanggapan untuk @whiner oleh @marc_s benar-benar benar: ini adalah mitos umum bahwa variabel tabel selalu berada dalam memori. Sebenarnya sangat umum untuk variabel tabel untuk pergi ke disk dan beroperasi seperti tabel temp.

Pokoknya saya sarankan untuk membaca set perbedaan dengan mengikuti tautan yang ditunjukkan oleh @Astander. Sebagian besar perbedaan melibatkan batasan pada apa yang tidak dapat Anda lakukan dengan variabel @table.

Aaron Bertrand
sumber
Saya memiliki 5 prosedur tersimpan terpisah yang melakukan berbagai bagian kalkulasi dan menghasilkan satu hasil. Untuk pengauditan, saya ingin melihat nilai antara dan begitu pula auditor. Saya menyesuaikan prosedur saya untuk membuang beberapa ke tabel ## Temp sehingga kami berdua dapat melihatnya tetapi mereka tidak dipertahankan (mereka hanya diperlukan selama audit). Ada kasus penggunaan yang valid untuk Anda (IMHO!).
RyanfaeScotland
@ Ryan mengapa ## Tabel valid ketika Anda bisa menggunakan dbo.Table? Saya tidak menganggapnya kasus penggunaan yang valid ketika semua yang Anda lakukan adalah menyelamatkan diri Anda sendiri dari mengetik pernyataan DROP.
Aaron Bertrand
4
Saya tidak ingin memberikan izin DROP kepada auditor pada DB saya. Saya juga tidak ingin harus kembali dan membereskan setelah dia selesai. Dengan tabel temp dia dapat menjalankan kueri sesering yang dia suka dan saya tahu ketika dia selesai dia tidak meninggalkan jejak di DB.
RyanfaeScotland
4
CREATE TABLE #t

Membuat tabel yang hanya terlihat pada dan selama CONNECTION itu pengguna yang sama yang membuat koneksi lain tidak akan bisa melihat tabel #t dari koneksi lain.

CREATE TABLE ##t

Membuat tabel sementara yang dapat dilihat oleh koneksi lain. Tapi tabel dijatuhkan ketika koneksi pembuatan diakhiri.

Markus
sumber
SqlConnection.Open()dengan string koneksi yang sama adalah CONNECTION yang sama ?
Kiquenet
2
tidak, ini adalah koneksi ke database yang sama, tetapi hampir pasti bukan koneksi yang sama.
Markus
0

jika Anda memerlukan tabel temp global yang unik, buat tabel Anda sendiri dengan Uniqueidentifier Prefix / Suffix dan jatuhkan eksekusi posting jika if object_id (.... Satu-satunya kelemahan adalah menggunakan Dynamic sql dan perlu menghapus secara eksplisit.

Schmed
sumber