objetos - lista de funciones de sql server
Nombres de objeto de SQL Server (3)
Me pregunto si alguien puede explicar el concepto de identificar de manera única los objetos del servidor sql en una unión.
En mi ejemplo, hay 2 esquemas y 2 tablas (pero con el mismo nombre). Mi suposición era que aunque el nombre de la tabla podría ser el mismo entre 2 esquemas, siempre que se haga referencia a ellos con su nombre completo calificado nombre_base_datos.schemaname.objectname, el servidor SQL debería poder distinguir la diferencia. Sin embargo, ese no parece ser el caso y la solución para esto es usar alias .
Apreciaría si alguien puede explicar o señalar algo de literatura sobre por qué el servidor sql no puede identificarlos de manera única .
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
Por lo que puedo decir, no veo ningún error en su código de muestra. Por favor explique en detalle qué errores está encontrando.
En cuanto a la convención de nombres de cuatro partes. la sintaxis del nombre completo del objeto es:
server.database.schema.object
Entonces, un uso completo sería, por ejemplo:
select * from servername.databasename.Sch1.Table_1
o
select * from servername.databasename.Sch2.Table_2
desde el cual puede ignorar cualquier parte siempre que no haya ambigüedad. Por lo tanto, en su ejemplo puede ignorar nombre de servidor y nombre de base de datos ya que son lo mismo. Pero no puede ignorar los nombres de los esquemas ya que no lo son.
Apéndice:
Según el mensaje de error que publicó más adelante, debe emplear la asignación de nombres de correlación en la sintaxis de unión:
select *
from Sch1.Table_1 as t1
inner join Sch2.Table_1 as t2 on t1.ID=t2.ID
SQL Server
admite identificadores de partes muliti:
linked_server.db_name.schema.table_name
En tu caso tienes:
Select *
From Sch1.Table_1
Join Sch2.Table_1
on Sch1.Table_1.Id = Sch2.Table_1.Id
Ahora se pregunta por qué SQL Server
no puede diferenciar entre ellos:
Sch1.Table_1 != Sch2.Table_1
El caso es debido a que SQL Server
usa algo llamado exposed name
.
nombre expuesto
que es la última parte del nombre de la tabla de varias partes (si no hay alias) o el nombre del alias cuando está presente
Volviendo a su consulta, ha expuesto los nombres Table_1
y Table_1
que son duplicados y necesita usar alias.
Desde SQL Server 2005+
:
El algoritmo de detección de tabla duplicada se ha modificado de forma correspondiente, de modo que cualquier tabla con los mismos nombres expuestos se considerará duplicada.
Sospecho que su código podría funcionar con SQL Server 2000 pero no puedo verificarlo con seguridad.
Para obtener más información, lea Msg 1013
Select *
From Sch1.Table_1 x
Join Sch2.Table_1 y
on x.Id = y.Id
¿Esto funciona?