valido objetos objeto nombre listar lista funciones buscar sql sql-server join objectname

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?