টেবিল সোমারস্কেমা তৈরি করুন? # টেম্পেটেবল নামটিতে একটি বাগ আছে?


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

এই প্রত্যাশিত আচরণ? আমি বুঝতে পারি এটি অবশ্যই স্কিমা-নির্দিষ্ট টেম্প টেবিলগুলির ব্যবহারের চারপাশে একটি প্রান্ত-কেস; তবে এটি খুব ভাল যদি ইঞ্জিনটি স্কিমা-বেঁধে অস্থায়ী টেবিল তৈরি করার চেষ্টা করার সময় ত্রুটি সরবরাহ করেছিল বা আসলে এটি ডিডিএলে উল্লিখিত স্কিমার সাথে আবদ্ধ করে।

এছাড়াও, আমার বর্তমানে এসকিউএল সার্ভার 2014 বা 2016 এ অ্যাক্সেস নেই; এটি কি এই প্ল্যাটফর্মে প্রত্যাশার মতো কাজ করে?


-4০--4১১ এর প্রশিক্ষণ কিটটিতে বলা হয়েছে যে 'ডিবিও স্কিমাতে টেম্পোরডে অস্থায়ী টেবিলগুলি তৈরি করা হয়েছে।' তবে এটি এর চেয়ে আরও কোনও তথ্যে যায় না, সুতরাং আমি নিশ্চিত না যে এর অর্থ কেবল তখনই আপনি করবেন না ' একটি স্কিমা নির্দিষ্ট করুন।
মার্ক সিনিংসন

উত্তর:


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
        ,
);

সম্ভবত বড় অংশে কারণ টেম্প টেবিলগুলি আসলে টেম্পডিবিতে তৈরি হয়েছিল এবং একটি স্থানীয় স্কিমা কাজ করবে না (আপনি যদি বাস্তবে অবশ্যই টেম্পডিবিতে না থাকেন)
কেনেথ ফিশার

সুতরাং একটি স্পষ্টভাবে কোড রয়েছে যা অস্থায়ী টেবিল তৈরি করার সময় স্কিমা নামটিকে উপেক্ষা করে; এবং যে কোড নীরব।
ম্যাক্স ভার্নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.