SQL Server tabloları: @, # ve ## arasındaki fark nedir?


Yanıtlar:


115

#table yerel (yalnızca onu oluşturan kullanıcı tarafından görülebilir) geçici bir tabloyu ifade eder.

##table genel (tüm kullanıcılar tarafından görülebilir) geçici bir tabloyu ifade eder.

@variableName türüne bağlı olarak değerleri tutabilen bir değişkeni ifade eder.


32
#Table tanımınız tamamen doğru değil. Kullanıcıyla sınırlı değil, daha çok bağlantı. Bir kullanıcının birden fazla bağlantısı varsa, bu yalnızca ilk etapta #table'ı oluşturan bağlantı tarafından görülebilir.
Davin Studer

@DavinStuder çok önemli bir açıklama yaptı. Kullanıcı tarafından görülebilen bir tablo ile sadece mevcut bağlantıda görünen bir tablo arasındaki ayrım çok önemlidir.
mirzmaster

@DavinStuder kullanıcı için birden fazla bağlantıyı nasıl görüntülüyor? aynı bağlantı dizesi?
Kiquenet

24

4
Bunun uzun bir zaman öncesine ait olduğunun farkındayım, ancak bu yalnızca bağlantıya dayalı bir yanıt olduğu için (ve ilk bağlantı öldüğü için), bağlantıların her birinden ana çıkarımlarla güncellenebilir mi?
Mike Guthrie

7

#ve ##tablolar, geçici veritabanında temsil edilen gerçek tablolardır. Bu tablolar dizinlere ve istatistiklere sahip olabilir ve bir oturumdaki sprocs üzerinden erişilebilir (genel bir geçici tablo olması durumunda, oturumlar arasında kullanılabilir).

@Table bir tablo değişkenidir.

Daha fazlası için: http://www.sqlteam.com/article/temporary-tables


4
Ve boyutu bellekte tutulamayacak kadar büyükse, tablo değişkeni tempDB veritabanında da yaşayacaktır.
marc_s

5

#Table ve @table arasındaki farklara odaklanırdım. ## tablosu küresel bir geçici tablodur ve 10 yılı aşkın süredir SQL Server kullanımıyla ilgili kayıt için henüz geçerli bir kullanım örneğiyle karşılaşmadım. Eminim bazılarının vardır, ancak nesnenin doğası onu çok kullanılamaz hale getirir IMHO.

@Marc_s tarafından @whiner'a verilen yanıt kesinlikle doğrudur: tablo değişkenlerinin her zaman bellekte yaşadığı yaygın bir efsanedir. Bir tablo değişkeninin diske gitmesi ve geçici bir tablo gibi çalışması aslında oldukça yaygındır.

Her neyse, @Astander tarafından belirtilen bağlantıları takip ederek farklılıklar kümesini okumayı öneririm. Farkın çoğu, @table değişkenleriyle yapamayacağınız şeylerle ilgili sınırlamaları içerir.


Bir hesaplamanın farklı bölümlerini gerçekleştiren ve tek bir sonuç veren 5 ayrı saklı yordamım var. Denetim için ara değerleri görmek istiyorum, denetçi de öyle. Prosedürlerimi bazılarını ## Temp tablosuna atacak şekilde düzenledim, böylece ikimiz de onları görüntüleyebiliriz, ancak bunlar tutulmaz (bunlar yalnızca denetimler sırasında gereklidir). Sizin için geçerli bir kullanım durumu var (IMHO!).
RyanfaeScotland

@Ryan dbo.Table kullanabilecekken ## Tablo neden geçerli? Yaptığınız tek şey kendinizi bir DROP ifadesi yazmaktan kurtarmak olduğunda, bunu geçerli bir kullanım durumu olarak görmüyorum.
Aaron Bertrand

4
Denetçiye DB'mde DROP izinleri vermek istemiyorum. Ayrıca işi bittikten sonra geri gelip toparlanmak zorunda kalmak istemiyorum. Geçici bir tablo ile sorguyu istediği sıklıkta çalıştırabilir ve bittiğinde DB'de bir ayak izi bırakmadığını biliyorum.
RyanfaeScotland

4
CREATE TABLE #t

Yalnızca bu BAĞLANTI üzerinde görünen bir tablo oluşturur ve bu BAĞLANTI sırasında başka bir bağlantı oluşturan aynı kullanıcı, diğer bağlantıdan #t tablosunu göremez.

CREATE TABLE ##t

Diğer bağlantıların görebildiği geçici bir tablo oluşturur. Ancak oluşturulan bağlantı sona erdiğinde tablo bırakılır.


SqlConnection.Open()ile aynı bağlantı dizesi olan aynı BAĞLANTI ?
Kiquenet

2
hayır, bu aynı veri tabanına bir bağlantı, ancak neredeyse kesinlikle aynı bağlantı değil.
Markus

0

Benzersiz bir genel geçici tabloya ihtiyacınız varsa, bir Benzersiz Tanımlayıcı Öneki / Sonek ile kendinizinkini oluşturun ve eğer nesne_kimliği varsa (.... Tek dezavantajı Dinamik sql kullanmaktır ve açıkça bırakmanız gerekir.

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.