2015-10-29 6 views
5

मुझे आश्चर्य है कि कोई व्यक्ति शामिल होने में विशिष्ट रूप से पहचानने वाले SQL सर्वर ऑब्जेक्ट्स की अवधारणा को समझा सकता है।SQL सर्वर ऑब्जेक्ट नाम

मेरे उदाहरण में 2 स्कीमा और 2 टेबल हैं (लेकिन एक ही नाम के साथ)। मेरी धारणा यह थी कि भले ही तालिका का नाम 2 स्कीमा के बीच समान हो, भले ही उन्हें उनके पूर्ण योग्य नाम databasename.schemaname.objectname के संदर्भ में संदर्भित किया गया हो, SQL सर्वर अंतर को करने में सक्षम होना चाहिए। हालांकि यह मामला प्रतीत नहीं होता है और इसके लिए वर्कअराउंड उर्फ ​​ का उपयोग करना है।

मैं सराहना करता हूं अगर कोई के आसपास कुछ साहित्य को समझा सकता है या बता सकता है कि SQL सर्वर इन की विशिष्ट पहचान क्यों नहीं कर सकता है।

CREATE SCHEMA [Sch1] 
GO 

CREATE SCHEMA [Sch2] 
GO 

CREATE TABLE [Sch1].[Table_1](
    [ID] [int] NULL, 
    [DESC] [nchar](10) NULL 
) ON [PRIMARY] 
GO 

CREATE TABLE [Sch2].[Table_1](
    [ID] [int] NULL, 
    [DESC] [nchar](10) NULL 
) ON [PRIMARY] 
GO 


Select * 
From Sch1.Table_1 
Join Sch2.Table_1 
    on Sch1.Table_1.Id = Sch2.Table_1.Id 
+0

क्या त्रुटि आपको मिल पढ़ा है? – lad2025

+0

FROM खंड में "DBA_2014.Sch2.Table_1" और "DBA_2014.Sch1.Table_1" ऑब्जेक्ट्स के समान खुला नाम हैं। उन्हें अलग करने के लिए सहसंबंध नामों का प्रयोग करें। – user2811633

+0

क्या आप SQL Server 2000 या संगतता स्तर 80 के साथ अपना कोड आज़मा सकते हैं? – lad2025

उत्तर

3

SQL Server muliti-भाग पहचानकर्ता का समर्थन करता है:

linked_server.db_name.schema.table_name 

आपके मामले में आप:

Select * 
From Sch1.Table_1 
Join Sch2.Table_1 
    on Sch1.Table_1.Id = Sch2.Table_1.Id 

अब तुम क्यों SQL Server उन दोनों के बीच अंतर नहीं कर सकते हैं:

Sch1.Table_1 != Sch2.Table_1 

सी एएस SQL Server की वजह से exposed name नामक कुछ का उपयोग करें।

उजागर नाम

जो बहु-भाग तालिका नाम की अंतिम हिस्सा होता है (अगर कोई अन्य नाम है), या अन्य नाम जब वर्तमान

पर वापस लौटते हुए आपकी क्वेरी में आपने Table_1 और Table_1 नामों का पर्दाफाश किया है जो डुप्लिकेट हैं और आपको उपनामों का उपयोग करने की आवश्यकता है।

से SQL Server 2005+:

डुप्लिकेट तालिका का पता लगाने एल्गोरिथ्म तदनुसार बदल दिया गया है, ताकि एक ही नाम के साथ संपर्क में किसी भी तालिका विचार किया जाएगा डुप्लिकेट

मुझे लगता है कि अपने कोड पर शक SQL सर्वर 2000 के साथ काम कर सकता है लेकिन मैं इसे निश्चित रूप से जांच नहीं सकता।

अधिक जानकारी के लिए Msg 1013

+1

मूल पोस्ट को इंगित करने के लिए धन्यवाद। इस पोस्ट में कुछ अतिरिक्त शोध और विवरण ने मुझे थोड़ा और समझने में मदद की। – user2811633

1

जहां तक ​​मेरा बता सकते हैं, मैं अपने नमूना कोड में किसी भी त्रुटि नहीं दिख रहा। कृपया विस्तार से समझाएं कि आप किन त्रुटियों का सामना कर रहे हैं।

चार भाग नामकरण सम्मेलन के लिए। पूर्ण ऑब्जेक्ट नाम वाक्य रचना है:

server.database.schema.object 

तो एक पूरा उपयोग हो सकता है, उदाहरण के लिए:

select * from servername.databasename.Sch1.Table_1 

या

select * from servername.databasename.Sch2.Table_2 

जिसमें से आप के रूप में के रूप में वहाँ लंबे समय तक किसी भी भाग की उपेक्षा कर सकते कोई अस्पष्टता नहीं है। इसलिए आपके उदाहरण में आप severname और databasename को अनदेखा कर सकते हैं क्योंकि वे वही हैं। लेकिन आप स्कीमा नामों को अनदेखा नहीं कर सकते हैं क्योंकि वे नहीं हैं।

परिशिष्ट:

त्रुटि संदेश आप बाद में, आप में शामिल होने के वाक्य रचना पर नामकरण सहसंबंध को रोजगार की जरूरत के आधार पर तैनात:

select * 
from Sch1.Table_1 as t1 
inner join Sch2.Table_1 as t2 on t1.ID=t2.ID 
+0

मैंने त्रुटि को जोड़ा है SQL सर्वर टिप्पणी – user2811633

+0

"सहसंबंध नामकरण" में उपर्युक्त क्वेरी के लिए उत्पन्न करता है। ठीक है, दिलचस्प एसक्यूएल त्रुटि संदेश। मुझे पता है कि ज्यादातर लोग इन्हें (आपके टी 1, टी 2) को "टेबल उपनाम" के रूप में संदर्भित करते हैं, और वे वास्तव में इस समस्या का समाधान हैं। –

+1

@ फिलिपकेली उर्फ ​​सही है, लेकिन मैं यहां उपनाम के उद्देश्य का जिक्र कर रहा हूं, जो खुला नामों से संबंधित है। –

0
Select * 
    From Sch1.Table_1 x 
    Join Sch2.Table_1 y 
     on x.Id = y.Id 

इस काम करता है?

+0

जब आप टेबल को उपनाम करते हैं तो आपको क्या त्रुटियां मिलती हैं? – proka