2015-10-29 3 views
5

Mi chiedo se qualcuno possa spiegare il concetto di identificazione univoca degli oggetti server SQL in un join.Nome oggetto server SQL

Nel mio esempio ci sono 2 schemi e 2 tabelle (ma con lo stesso nome). La mia ipotesi era che, anche se il nome della tabella potrebbe essere lo stesso tra 2 schemi, purché siano referenziati con il nome completo completo databasename.schemaname.objectname, SQL Server dovrebbe essere in grado di distinguere la differenza. Tuttavia, ciò non sembra essere il caso e la soluzione alternativa è utilizzare alias.

Sarei grato se qualcuno possa spiegare o fare riferimento a qualche letteratura in merito a , perché il server SQL non può identificare in modo univoco questi.

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

Che errore che si ottiene? – lad2025

+0

Gli oggetti "DBA_2014.Sch2.Table_1" e "DBA_2014.Sch1.Table_1" nella clausola FROM hanno gli stessi nomi esposti. Utilizzare i nomi di correlazione per distinguerli. – user2811633

+0

Puoi provare il tuo codice con SQL Server 2000 o livello di compatibilità 80? – lad2025

risposta

3

Il SQL Server supporta identificatori muliti parti:

linked_server.db_name.schema.table_name 

Nel tuo caso si dispone di:

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

Ora si chiedono perché SQL Server non può distinguere tra di loro:

Sch1.Table_1 != Sch2.Table_1 

Il c ase è a causa di SQL Server utilizzare qualcosa chiamato exposed name.

esposto nome

che è l'ultima parte del multi-parte nome della tabella (se non c'è alias), o alias quando presente

Ritornando Nella tua query hai esposto i nomi Table_1 e Table_1 che sono duplicati ed è necessario utilizzare alias.

Da SQL Server 2005+:

algoritmo di rilevamento tabella duplicato è stato modificato di conseguenza, in modo che tutte le tabelle con gli stessi nomi esposti saranno considerati duplica

ho il sospetto che il codice potrebbe funzionare con SQL Server 2000 ma non posso verificarlo di sicuro.

Per maggiori informazioni leggi Msg 1013

+1

Grazie per aver indicato il post originale. Alcune ricerche e dettagli in più nel post mi hanno aiutato a capire questo poco di più. – user2811633

1

Per quanto posso dire, non vedo errori nel codice di esempio. Si prega di spiegare in dettaglio quali errori si incontrano.

Come per la convenzione di denominazione in quattro parti. la sintassi nome dell'oggetto completo è:

server.database.schema.object 

Quindi un utilizzo completo sarebbe, ad esempio:

select * from servername.databasename.Sch1.Table_1 

o

select * from servername.databasename.Sch2.Table_2 

da cui è possibile ignorare qualsiasi parte fintanto che non vi non è un'ambiguità. Pertanto nel tuo esempio puoi ignorare severname e databasename come sono gli stessi. Ma non puoi ignorare i nomi degli schemi perché non lo sono.

Addendum:

Sulla base di messaggio di errore che hai postato in seguito, è necessario impiegare la correlazione denominazione sulla sintassi join:

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

Ho aggiunto l'errore che il server SQL produce per la query precedente nel commento – user2811633

+0

"Denominazione correlazione". Ok, interessante messaggio di errore SQL. La maggior parte di tutti quelli che conosco si riferisce a questi (il tuo t1, t2) come "alias di tabella" e sono davvero la soluzione a questo problema. –

+1

L'alias @PhilipKelley ha ragione, ma mi riferisco allo scopo dell'alias qui, che è correlato ai nomi esposti. –

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

funziona?

+0

Quali errori si ottengono quando si alias il tavolo? – proka