Consulta sem precisar especificar o esquema da tabela

10

Importei várias tabelas do SQL Server 2000 para o meu banco de dados de 2008. Todas as mesas importados são prefixados com meu nome de usuário, por exemplo: erpadmin.tablename.

Nas propriedades da tabela, lista 'erpadmin' como o esquema db. Quando escrevo uma consulta, agora tenho que incluir 'erpadmin'. na frente de todos os nomes de tabela, o que é confuso.

Resultado atual:

select *
from erpadmin.tablename

Resultado desejado:

select *
from  tablename
Ramdas Bhosale
fonte

Respostas:

23

Se você quiser voltar a usar o esquema dbo como no SQL Server 2000, poderá mover a tabela novamente para o esquema dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Uma alternativa, se você gosta de ter o esquema não-dbo, é definir o esquema padrão do usuário para erpadmin, se você não especificar um esquema, ele será usado como padrão. (Os membros da função de servidor fixa sysadmin ignoram DEFAULT_SCHEMAe usam dbopor padrão.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

No entanto, o nome de duas partes que você tem (schema.table) é um bom hábito, para que você possa ser explícito com a tabela a que se refere. Alguns recursos exigem o uso de um nome de duas partes. As exibições indexadas são um exemplo.

Adam Wenger
fonte
17

Este é um caso clássico do motivo pelo qual você deve especificar o nome do esquema ao acessar objetos de banco de dados. Quando não for especificado e você estiver tentando acessar um objeto em um esquema não padrão, encontrará o problema que está vendo no momento.

A correção real é alterar o aplicativo (ou qualquer outro agente de consulta que você esteja causando o problema) para ser explícito.

Quando escrevo uma consulta, agora tenho que incluir 'erpadmin'. na frente de todos os nomes de tabela, o que é confuso.

Isso não é confuso, é uma convenção de nomenclatura explícita . Eu recomendo que você fique com essa nomenclatura para evitar embaralhamento e inconsistências de objetos.

Thomas Stringer
fonte
3
Outro motivo para sempre usar nomes de duas partes é evitar a situação em que vários usuários executam o mesmo código (por exemplo select ... from table5 ;) e obter resultados diferentes. Isso é ruim para o cache do plano e também para a solução de problemas (responsável pelo suporte da sugestão, "essa consulta é executada aqui"). Além disso, a ligação de esquema, necessária para a indexação de funções e visualizações, requer dois nomes de partes. TLDR: deixe de ser preguiçoso - use dois nomes de partes.
Greenstone Walker
7

Além da resposta ao @AdamWenger. Para criar scripts para transferir para outro esquema, você pode usar o seguinte 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'
Igor Borisenko
fonte
4

É provável que seu problema seja devido à maneira como a migração foi feita. O material não deve ser anexado ao seu usuário, a menos que você seja considerado o proprietário.

Existem esquemas para ajudá-lo a separar as tabelas de acordo com o que fizer sentido. Suponha que você tenha uma tabela de recursos para o departamento de RH e deseje uma tabela separada para o departamento de produção, mantendo os dois no mesmo banco de dados. Nesse caso, você pode ter duas tabelas nomeadas recursos, uma no esquema de produção e outra no esquema de RH. É por isso que shcemas deve ser especificado, a menos que você traga itens para o esquema padrão.

Se você não está refazendo a migração por algum outro motivo, a transferência de Adam Wenger deve ser uma opção inteligente.

JoseTeixeira
fonte
-2

Inicie seu comando com USE [tablename] Sua consulta não possui um banco de dados associado para referência e o banco de dados que você está visualizando não é o padrão para o usuário conectado. Na parte superior da janela de consulta, provavelmente diz "mestre"

John
fonte
3
Você quer dizer [database_name]né?
dezso