Suspeito que você tenha duas tabelas com o mesmo nome. Um pertence ao esquema 'dbo' ( dbo.PerfDiag) e o outro pertence ao esquema padrão da conta usada para se conectar ao SQL Server (algo semelhante userid.PerfDiag).
Quando você tem uma referência não qualificada a um objeto de esquema (como uma tabela) - um não qualificado pelo nome do esquema - a referência do objeto deve ser resolvida. A resolução de nomes ocorre pesquisando na seqüência a seguir por um objeto do tipo apropriado (tabela) com o nome especificado. O nome resolve para a primeira correspondência:
- Sob o esquema padrão do usuário.
- Sob o esquema 'dbo'.
A referência não qualificada é vinculada à primeira correspondência na sequência acima.
Como prática geral recomendada, deve-se sempre qualificar referências a objetos de esquema, por motivos de desempenho:
Uma referência não qualificada pode invalidar um plano de execução em cache para o procedimento armazenado ou consulta, já que o esquema ao qual a referência foi associada pode mudar dependendo das credenciais que executam o procedimento armazenado ou consulta. Isso resulta na recompilação da consulta / procedimento armazenado, um impacto no desempenho. Recompilações fazem com que bloqueios de compilação sejam retirados, impedindo que outros acessem o (s) recurso (s) necessário (s).
A resolução de nomes retarda a execução da consulta, pois duas sondagens devem ser feitas para resolver a versão provável do objeto (que pertence a 'dbo'). Este é o caso usual. A única vez que uma única investigação resolverá o nome é se o usuário atual possuir um objeto com o nome e tipo especificados.
[Editado para nota posterior]
As outras possibilidades são (sem ordem específica):
- Você não está conectado ao banco de dados que pensa que está.
- Você não está conectado à instância do SQL Server que pensa que está.
Verifique novamente suas strings de conexão e certifique-se de que elas especifiquem explicitamente o nome da instância do SQL Server e o nome do banco de dados.