Consulta sin tener que especificar el esquema de la tabla


10

Importé un montón de tablas de SQL Server 2000 a mi base de datos de 2008. Todas las tablas importadas tienen el prefijo mi nombre de usuario, por ejemplo: erpadmin.tablename.

En las propiedades de la tabla, enumera 'erpadmin' como el esquema db. Cuando escribo una consulta ahora tengo que incluir 'erpadmin'. delante de todos los nombres de tabla que es confuso.

Resultado actual:

select *
from erpadmin.tablename

Resultado deseado:

select *
from  tablename

Respuestas:


23

Si desea volver a usar el esquema dbo como lo estaba en SQL Server 2000, puede volver a mover la tabla al esquema dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Una alternativa si desea tener un esquema que no sea dbo es configurar el esquema predeterminado de su usuario para que erpadmin, si no especifica un esquema, lo usará como predeterminado. (Los miembros de la función fija de servidor sysadmin ignoran DEFAULT_SCHEMAy usan dbode forma predeterminada).

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Sin embargo, el nombre de dos partes que tiene (schema.table) es un buen hábito, por lo que puede ser explícito con qué tabla se refiere. Algunas características requieren que use un nombre de dos partes, las Vistas indexadas son un ejemplo.


17

Este es un caso clásico de por qué debe especificar el nombre del esquema al acceder a los objetos de la base de datos. Cuando no se especifica y está intentando acceder a un objeto en un esquema no predeterminado, se encontrará con el problema que está viendo en este momento.

La solución real es cambiar su aplicación (o cualquier agente de consulta que tenga ahora que causa el problema) para que sea explícito.

Cuando escribo una consulta ahora tengo que incluir 'erpadmin'. delante de todos los nombres de tabla que es confuso.

Eso no es confuso, es una convención de nomenclatura explícita . Le recomiendo que se mantenga con esa nomenclatura para evitar la mezcla de objetos y las inconsistencias.


3
Otra razón para usar siempre nombres de dos partes es evitar la situación en la que varios usuarios ejecutan el mismo código (por ejemplo select ... from table5 ;) y obtienen resultados diferentes. Esto es malo para el almacenamiento en caché del plan y también para la solución de problemas (persona de soporte de referencia, "esa consulta funciona bien aquí"). Además, el enlace de esquema, que se requiere para indexar funciones y vistas, requiere dos nombres de parte. TLDR: deja de ser perezoso: usa nombres de dos partes.
Greenstone Walker

7

Como complemento de la respuesta @AdamWenger. Para crear scripts para transferir a otro esquema, puede usar el siguiente script

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

Su problema probablemente se deba a cómo se realizó la migración. Las cosas no deben adjuntarse a su usuario, a menos que se lo considere el propietario.

Los esquemas están ahí para ayudarlo a separar las tablas de cualquier forma que tenga sentido. Supongamos que tiene una tabla de recursos para el departamento de recursos humanos y desea una tabla separada para el departamento de producción, manteniendo ambas en la misma base de datos. En ese caso, puede tener dos tablas denominadas recursos, una en el esquema de producción y otra en el esquema de recursos humanos. Es por eso que se deben especificar shcemas, a menos que traigas cosas al esquema predeterminado.

Si no está rehaciendo la migración por alguna otra razón, la transferencia de Adam Wenger debería ser una buena opción.


-2

Inicie su comando con USE [tablename] Su consulta no tiene una base de datos asociada a la que hacer referencia y la base de datos que está viendo no es la predeterminada para el usuario conectado En la parte superior de la ventana de consulta, probablemente dice "maestro"


3
¿Quieres decir [database_name]verdad?
dezso
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.