Soru SQL Server 2005'te geçici bir tablo varsa doğru olarak nasıl denetlenir?


Tablodan bazı değerler eklediğim bir sorgum var:

SELECT ID, NAME INTO #tmpTable1
FROM TableOriginal

İlk yürütme iyi, MSSMS'de (Microsoft Sql Server Management Studio) F5'e (Çalıştır) basarsam hata oluştu:

Msg 2714, Seviye 16, Durum 6, Satır 4
  Veritabanında zaten '# tmpTable1' adında bir nesne var.

İyi. Verileri eklemeden önce kontrol etmeye karar verdim TableOriginal için #tmpTable1 kullanarak:

IF OBJECT_ID('tempdb.#tmpTable1') IS NOT NULL  
  DROP TABLE #tmpTable1

Çalışmıyor, hata yukarıdaki gibi tekrar gösteriyor.

Ben gördüm tempdb Aşağıdaki geçici tablo adını veritabanı:

dbo.#tmpTable1__________________0000007

Niye ya? Her zaman geçici bir tablo oluştururken (ilk sorguyu kullanarak), tablo adı MSSMS'de otomatik olarak oluşturulacak mı?

Yeni değerler içeren yeni bir tablo yapmak için mevcut geçici tablo nasıl kaldırılır?


25
2017-08-16 11:56


Menşei




Cevaplar:


Sen çok yakınsın - çekinde iki nokta kullanmalısın:

IF OBJECT_ID('tempdb..#tmpTable1') IS NOT NULL  
                    ** 
                    |
                  use two dots here!

Temel olarak, diyor ki: kontrol et tempDB ve masanın hangi şemada olduğu umurumda değil

Joe'nun haklı olarak söylediği gibi: bu% 100 doğru değil: her şemayı kontrol etmiyor - yalnızca varsayılan kullanıcı şemasındaki - normal olarak kontrol edilecek dbo. Yani bu da işe yarayacaktı:

IF OBJECT_ID('tempdb.dbo.#tmpTable1') IS NOT NULL  

Nesnelerinizi varsayılan sahibin dışında bir şemada oluşturursanız, o zaman atıfta bulunduğunuz şemayı açıkça belirtmeniz gerekir. Ama temp tablolar tempDB gerçekten de dbo şema.


53
2017-08-16 11:57



LOL, buna ek olarak nokta farkı yapar :). teşekkür ederim - Snake Eyes
@MichaelSwan: yup, SQL Server'ın üç bölümlü isimlendirmesi budur: db.schema.object - Şemayı terk ederseniz - hala noktalara ihtiyacınız var! :-) - marc_s
@marc_s: Sanırım, (çift nokta) varsayılan sahibine, yani dbo'ya - Joe G Joseph
@marc_s: C # ASP.NET'ten arama yaparsam DROP tablosuna ihtiyacım var mı? Ya da bağlantı havuzlu, otomatik olarak kaldırılacak? - Snake Eyes
@Joe & marc Bir cevabı ekledim çünkü bir yorumda şema şeyini netleştiremedim. - Aaron Bertrand


Bu sorunun cevabı değil, sadece geçici olarak geçici bir cevap vermek istedim. .dbo. vs. .. Bir #temp tablosuna başvururken.

#Temp tablosunun aslında dbo dışındaki herhangi bir şeye ait olması için bir yol bulamadım. Dene:

CREATE SCHEMA blat;
GO

CREATE TABLE blat.#pound(id INT);
GO

SELECT 
   OBJECT_ID('tempdb..#pound'), 
   OBJECT_ID('tempdb.dbo.#pound'), 
   OBJECT_ID('tempdb.blat.#pound');

USE tempdb;
GO

SELECT [object_id], SCHEMA_NAME([schema_id]) 
  FROM sys.objects 
  WHERE name LIKE '#pound%';

Sonuçlar:

-1222354987    -1222354987    -1222354987

-1222354987    dbo

Bu, SQL Server 2012 üzerindeydi. Bunu SQL Server 2005'te test ettim ve tek fark, object_id değerlerinin pozitif olmasıydı. Ben de denedim:

  • tempdb'de var olan bir şema blat
  • masa blat.#pound varsayılan şeması olan bir kullanıcı tarafından oluşturuldu blat
  • Yukarıdakilerin ikisi de

Her üç durumda da, yukarıdakiyle aynı sonuçlar elde edildi.

Ayrıca farklı şemalarda aynı ada sahip iki #temp tablosu oluşturamazsınız:

CREATE TABLE blat.#flab(id INT);
CREATE TABLE dbo.#flab(id INT);

Sonuç:

Msg 2714, Seviye 16, Durum 6
  Veritabanında zaten '#flab' adlı bir nesne var.

Bu bir ayrıştırma problemi değildir (birçok #temp tablo sorunu gibi); Bu iki ifadeyi ayrı ayrı çalıştırabilir ve aynı hatayı alabilirsiniz.

Yani, bu uzun-sarmalı bir yoldur, #temp tablo ismini çözerken şemayı belirtmenize gerek yoktur, her zaman altında oluşturulacaktır. dbo ve en azında çözünürlük OBJECT_ID belirttiğiniz şemayı yok sayar (OBJECT_SCHEMA_NAME ayrıca her zaman döner dbo #tempdb bağlamında çalıştırıldığında, ancak başka bir veritabanında değilken). Sorgulamaya çalışırsanız tüm bahisler kapalıdır schema_id içinde tempdb.sys.objects.


9
2017-08-16 12:43





Sıcaklık tablosu, oluşturulan bağlantı açık olduğu sürece bu şekilde tanımlanacaktır. Bağlantınızda tam kontrole sahip olduğunuzdan genellikle var olup olmadığını kontrol etme veya elle bırakma gerek yoktur, ancak gerçekten kontrol etmeniz gerekiyorsa tempdb.dbo. # TempTable öğesini kontrol edebilirsiniz.


0
2017-08-16 12:03





CREATE TABLE #temptable (col1 int);
GO
INSERT INTO #temptable
VALUES (10);
GO
SELECT * FROM #temptable;
GO
IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT NULL 
DROP TABLE #temptable;
GO
--Test the drop.
SELECT * FROM #temptable;

0
2018-05-11 09:23





IF OBJECT_ID ('tempdb.dbo. # TmpTable1%') NULL DEĞİLDİR :)


-1
2018-02-02 20:58



üzgünüm, çalışma: p - user4521610
IF OBJECT_ID ('tempdb.dbo. # TmpTable1') NULL değil, ama bu evet sunucu 2008. temp # hayır kontrol etmek, ama # bir oturumda rekreasyonu önlemek gerekir ... - user4521610
Neden sen güncelleştirme Yayınınızdaki yorumları düzeltmelere yerleştirmekten ziyade doğru kodla mı? Çok açık değil. - rayryeng