क्या कुछ सेल्समे बनाता है। # TempTableName में बग है?


12

सरल परीक्षण-बिस्तर:

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;

ऊपर नामित स्कीमा के तहत अस्थायी तालिका में नामित एक अस्थायी तालिका बनाना चाहिए ; हालाँकि यह नहीं है। इसके बजाय तालिका स्कीमा में बनाई गई है । #MyTempTableSomeSchemadbo

क्या यह अपेक्षित व्यवहार है? मुझे पता है कि यह निश्चित रूप से स्कीमा-विशिष्ट अस्थायी तालिकाओं के उपयोग के आसपास का एक किनारा-मामला है; हालाँकि यह अच्छा होगा यदि स्कीमा-बाउंड अस्थायी तालिका बनाने का प्रयास करते समय इंजन या तो एक त्रुटि प्रदान करता है, या वास्तव में इसे डीडीएल में निर्दिष्ट स्कीमा से बाँधता है।

इसके अलावा, मेरे पास वर्तमान में SQL Server 2014 या 2016 तक पहुंच नहीं है; क्या यह उन प्लेटफार्मों पर अपेक्षित रूप से काम करता है?


70-461 के लिए प्रशिक्षण किट में कहा गया है कि 'अस्थायी स्कीमा में अस्थायी तालिकाएँ बनाई गई हैं।' टी स्कीमा निर्दिष्ट करें।
मार्क सिनकिंसन

जवाबों:


11

दोनों संदर्भ मान्य हैं और सही ढंग से हल करेंगे, लेकिन dboस्कीमा के तहत # तालिका बनाई गई है ।

एक ही जवाब (आपके सिस्टम पर, कुछ संख्या जो मैं संभवतः अनुमान नहीं लगा सकता):

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

समान उत्तर (दोनों 1, जो है 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');

एक स्कीमा निर्दिष्ट करने में सक्षम होने से आप कुछ भी नहीं खरीद सकते हैं क्योंकि आप एक सत्र के भीतर टकरावों (दो अलग-अलग स्कीमाओं के तहत दो-नामित # टेबल) के लिए नहीं जा रहे हैं, है ना?

यह अपेक्षित व्यवहार है। एक # टेबल एक सत्र से बंधा हुआ है, लेकिन एक विशिष्ट स्कीमा के लिए नहीं। और यह 2016 सीटीपी 3.2 तक सभी तरह से काम करता है। पार्सर शायद क्षमा कर रहा है, अर्थहीन स्कीमा नाम को उसी तरह से अनुमति देता है जिस तरह से यह इस गलत अनुगामी अल्पविराम की अनुमति देता है:

CREATE TABLE dbo.foo 
(
        bar INT
        ,
);

संभवतः बड़े हिस्से में क्योंकि टेम्प टेबल वास्तव में TempDB में बनाए गए हैं और एक स्थानीय स्कीमा काम नहीं करेगा (जब तक कि आप वास्तव में TempDB में नहीं थे)
केनेथ फिशर

इसलिए स्पष्ट रूप से कोड है जो एक अस्थायी तालिका बनाते समय स्कीमा नाम की उपेक्षा करता है; और वह कोड चुप है।
मैक्स वर्नोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.