मैं एक परियोजना पर काम कर रहा हूं और चयन INTO का उपयोग करते समय कुछ रोचक व्यवहार में आया हूं। अगर मेरे पास int identity(1,1) not null
के रूप में परिभाषित कॉलम वाला एक टेबल है और इसे कॉपी करने के लिए चयन करें INTO का उपयोग करें, तो नई तालिका पहचानकर्ता संपत्ति को तब तक बनाए रखेगी जब तक कोई शामिल न हो। यदि कोई जुड़ाव है, तो नई तालिका पर एक ही कॉलम को int not null
के रूप में परिभाषित किया गया है।व्यवहार और पहचान संपत्ति में चयन करें
CREATE TABLE People (Id INT IDENTITY(1,1) not null, Name VARCHAR(10))
CREATE TABLE ReverseNames (Name varchar(10), ReverseName varchar(10))
INSERT INTO People (Name)
VALUES ('John'), ('Jamie'), ('Joe'), ('Jenna')
INSERT INTO ReverseNames (Name, ReverseName)
VALUES ('John','nhoJ'), ('Jamie','eimaJ'), ('Joe','eoJ'), ('Jenna','anneJ')
--------
SELECT Id, Name
INTO People_ExactCopy
FROM People
SELECT Id, ReverseName as Name
INTO People_WithJoin
FROM People
JOIN ReverseNames
ON People.Name = ReverseNames.Name
SELECT Id, (SELECT ReverseName FROM ReverseNames WHERE Name = People.Name) as Name
INTO People_WithSubSelect
FROM People
--------
SELECT OBJECT_NAME(c.object_id) as [Table],
c.is_identity as [Id Column Retained Identity]
FROM sys.columns c
where
OBJECT_NAME(c.object_id) IN ('People_ExactCopy','People_WithJoin','People_WithSubSelect')
AND c.name = 'Id'
--------
DROP TABLE People
DROP TABLE People_ExactCopy
DROP TABLE People_WithJoin
DROP TABLE People_WithSubSelect
DROP TABLE ReverseNames
मैंने देखा है कि दोनों WithJoin और WithSubSelect प्रश्नों के लिए निष्पादन की योजना एक ऑपरेटर में शामिल होने का समावेश है:
यहाँ एक स्क्रिप्ट है कि आप व्यवहार पुन: पेश करने चला सकते है। मुझे यकीन नहीं है कि अगर हम पंक्तियों के बड़े सेट से निपट रहे थे तो प्रदर्शन पर कोई बेहतर प्रदर्शन करेगा।
क्या कोई इस पर कोई प्रकाश डाल सकता है और मुझे बता सकता है कि क्या जुड़ने के साथ चयन का उपयोग करने का कोई तरीका है और फिर भी पहचान संपत्ति को सुरक्षित रखता है?
"मुझे नहीं लगता कि वे आसानी से निर्धारणीय हैं" मैं यह असंभव कहूंगा कि आईडी फ़ील्ड में –
अंतराल में एक ही चयन में मुझे नहीं लगता कि आपको यह समस्या होगी। पहचान कॉलम में अंतर आमतौर पर एकाधिक प्रविष्टियों के बीच होने वाली रोलबैक के कारण होते हैं। समस्या यह है कि आईडी को क्वेरी प्लान में कहीं भी जेनरेट किया जा सकता है, जिसका मतलब किसी भी क्रम में जरूरी नहीं है। –
'चयन करें' जस्टिन के उदाहरण का उपयोग करते हुए 'सेट आईडीएनटीआईसीएसईआरटी ऑन' के समतुल्य है यदि आप 'सेलेक्ट्स' से पहले नाम 'नाम' से पहले नाम हटाएं, जो और 'जेमी' आईडी और 3 के आईडी को बनाए रखता है। फ़ंक्शन इसे संरक्षित नहीं करेगा। आप प्रत्येक 5 सेकंड में केवल एक टिप्पणी संपादित कर सकते हैं। (इस बॉक्स पर खारिज करने के लिए क्लिक करें) –