CREATE TABLE SomeSchema. # TempTableName hata veriyor mu?


12

Basit test yatağı:

USE tempdb;
GO

/*
    This DROP TABLE should not be necessary, since the DROP SCHEMA
    should drop the table if it is contained within the schema, as
    I'd expect it to be.
*/
IF COALESCE(OBJECT_ID('tempdb..#MyTempTable'), 0) <> 0 
    DROP TABLE #MyTempTable;

IF EXISTS (SELECT 1 FROM sys.schemas s WHERE s.name = 'SomeSchema') 
    DROP SCHEMA SomeSchema;
GO

CREATE SCHEMA SomeSchema AUTHORIZATION [dbo]
CREATE TABLE SomeSchema.#MyTempTable /* specifying the schema
                                        should not be necesssary since
                                        this statement is executed inside
                                        the context of the CREATE SCHEMA
                                        statement
                                     */
(
    TempTableID INT NOT NULL IDENTITY(1,1)
    , SomeData VARCHAR(50) NOT NULL
);
GO

INSERT INTO tempdb.SomeSchema.#MyTempTable (SomeData) VALUES ('This is a test');

SELECT *
FROM tempdb.SomeSchema.#MyTempTable;
GO

SELECT *
FROM sys.objects o
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE s.name = 'SomeSchema';

SELECT s.name
    , o.name
FROM sys.objects o
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id
WHERE s.name = 'dbo'
    AND o.name LIKE '%MyTempTable%';

DROP SCHEMA SomeSchema;
DROP TABLE #MyTempTable;

Yukarıdaki tempdb adlı şema altında geçici bir tablo oluşturmak gerekir ; ancak öyle değil. Bunun yerine tablo şemada oluşturulur . #MyTempTableSomeSchemadbo

Bu beklenen davranış mı? Bunun şemaya özgü geçici tabloların kullanımı konusunda kesinlikle bir avantaj olduğunu fark ediyorum; ancak motorun şemaya bağlı geçici bir tablo oluşturmaya çalışırken bir hata vermesi veya DDL'de belirtilen şemaya gerçekten bağlaması iyi olurdu.

Ayrıca, şu anda SQL Server 2014 veya 2016'ya erişimim yok; bu platformlarda beklendiği gibi çalışıyor mu?


70-461 için Eğitim Seti, 'Geçici tablolar dbo şemasında tempdb'de oluşturuldu' ifadesini belirtir, ancak bundan daha fazla bilgi girmez, bu yüzden bunun yalnızca yapmadığınız zaman anlamına gelmediğinden emin değilim. t bir şema belirtme.
Mark Sinkinson

Yanıtlar:


11

Her iki başvuru da geçerlidir ve doğru şekilde çözümlenir, ancak #temp tablosu dboşema altında oluşturulur .

Aynı cevap (sisteminizde tahmin edemediğim bir sayı):

SELECT OBJECT_ID('dbo.#MyTempTable');
SELECT OBJECT_ID('SomeSchema.#MyTempTable');

Aynı cevap (her ikisi de 1'dir dbo):

SELECT schema_id FROM sys.tables WHERE [object_id] = OBJECT_ID('dbo.#MyTempTable');
SELECT schema_id FROM sys.tables WHERE [object_id] = OBJECT_ID('SomeSchema.#MyTempTable');

Bir şemayı belirleyebilmeniz size bir şey satın almaz çünkü bir oturumda çarpışmalar (farklı şemalar altında iki aynı adlı #temp tablosu) olmayacaksınız, değil mi?

Bu beklenen davranıştır. #Temp tablosu bir oturuma bağlıdır, ancak belirli bir şemaya bağlı değildir. Ve 2016 CTP 3.2'ye kadar aynı şekilde çalışıyor. Ayrıştırıcı muhtemelen affedicidir ve anlamsız şema adının bu hatalı sondaki virgülle aynı şekilde olmasına izin verir:

CREATE TABLE dbo.foo 
(
        bar INT
        ,
);

Muhtemelen büyük ölçüde Temp tabloları aslında TempDB oluşturulan ve yerel bir şema işe yaramaz çünkü (aslında tabii ki TempDB sürece)
Kenneth Fisher

Bu nedenle, geçici bir tablo oluştururken şema adını yok sayan bir kod vardır; ve bu kod sessizdir.
Max Vernon
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.