Criei uma tabela testtable
dentro do banco de dados testbase
que tem a seguinte estrutura:
product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)
que usei o Microsoft SQL Server 2008 Management Studio.
Eu criei um procedimento armazenado testtable_pricesmaller
da seguinte forma
use testbase
go
create procedure testtable_pricesmaller
@pricelimit money
as
select * from testtable where price = @pricelimit;
go
e são capazes de visualizar os procedimentos armazenados no Object Explorer
Microsoft SQL Server Management Studio. (Está listado na seguinte estrutura em árvore do Object Explorer
)
Databases
+ testbase
+ Tables
+ dbo.testtable
+ Programmability
+ Stored Procedures
+ dbo.testtable_pricesmaller
Acho muito estranho quando recebo o seguinte erro:
Could not find the stored procedure 'dbo.testtable_pricesmaller'.
quando executo a seguinte instrução SQL:
execute dbo.testtable_pricesmaller 50
O que pode estar faltando?
Você não deve ter que reiniciar o banco de dados depois de adicionar um novo procedimento armazenado, embora você precise atualizar seu explorador de objetos para vê-lo lá.
Na próxima vez que você adicionar um procedimento armazenado, tente executar a opção executar com o botão direito do mouse no explorador de objetos e insira seus parâmetros e veja se ele é executado. Se ele não funcionar, então não tenho certeza qual é o seu problema. Se ele for executado, pode ser algo simples, como o SQL está tentando consultar o banco de dados errado.
Finalmente eu sei porque a mensagem aparece no MS SQL Server Management Studio.
O MS SQL Server Management Studio requer um reiniciá-lo depois de criar um procedimento armazenado nele.
Depois de reiniciar o MS SQL Server Management Studio, não há mais esse erro.
(Estranho, isso significa que toda vez que crio um procedimento armazenado, tenho que reiniciá-lo?)
No SQL Server 2008, quando conectado em uma conta do Windows, se você não tiver o nível de segurança SYSADMIN, ao criar um objeto sem especificar explicitamente o esquema, ele poderá/irá criá-lo sob o [DOMAIN\username].[ObjectName] ] em vez de [dbo].[ObjectName] (foi corrigido no SQL Server 2012, eu acho).
Eu tive esse problema comigo quando reduzi o nível de segurança de um usuário, e um dos procedimentos que ele estava executando estava descartando e recriando tabelas sem um esquema, então o restante do procedimento estava travando porque não conseguia acessar o objeto novamente . Acontece que as tabelas agora foram criadas sob seu nome de usuário de domínio.
Aqui está a postagem da Microsoft sobre esse comportamento:
https://learn.microsoft.com/en-us/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (procure a seção "Esquema Implícito e Criação de Usuário")
Tabela não sendo criada no esquema dbo
SQL 2008 R2 cria usuário/esquema quando o usuário do Windows cria tabelas
Então, resumindo, você provavelmente tem um problema de banco de dados (você cria sua tabela em um banco de dados, mas tenta acessá-la de outro) ou você tem o problema como acabei de descrever.
Seu comando de criação deve ser
você está faltando
dbo.
antes do nome do procedimento. Sempre que você cria um procedimento, é uma boa prática definir explicitamente o usuário/esquema com o nome de um procedimento, ou seja, o nome do procedimento deve ter assinaturas totalmente qualificadas.Eu espero que isso te ajude.
Eu sei que isso é antigo; Me deparei com essa pergunta enquanto procurava uma solução para esse mesmo problema e estou postando esta resposta na esperança de que ajude outras pessoas que também encontrarem essa pergunta.
No meu caso, recebi a mensagem de erro ao executar um relatório do SSRS usando uma fonte de dados compartilhada. Essa fonte de dados compartilhada não especificou um banco de dados padrão (o parâmetro Default Catalog=) e não consegui adicioná-lo à string de conexão porque não tenho a senha (e quando você altera algo em uma fonte de dados SSRS, tende a desejar que você reinsira a senha).
Para resolver isso, alterei o banco de dados padrão para o login na instância do SQL Server de mestre para o banco de dados que contém o procedimento armazenado que o relatório desejava executar.
Ao executar coisas do SSMS, lembre-se de que o painel Object Explorer é uma conexão, enquanto o editor que você possui é uma conexão totalmente diferente. Então você pode ver os objetos para SQL01 no Pesquisador de Objetos, mas o código que você está executando em um editor será executado no SQL02 - eu me deparei com esse problema algumas vezes ao longo dos anos e depois de muito xingar e "Por que não funciona?" percebeu meu erro. Para o editor, olhe no canto inferior direito para ver a qual instância e banco de dados você está conectado.
TL;DR: você pode ter um procedimento armazenado que está chamando outro procedimento armazenado que não existe.
Eu tive esse problema e encontrei uma correção. Aqui está o que aconteceu. Eu criei um procedimento armazenado:
Eu então criei outro procedimento armazenado que executou o primeiro
Algum tempo depois, renomeei
dbo.MyProc
paradbo.MyProc2
. Depois de renomeá-lo, quando tentei chamardbo.MyProcCaller
, recebi esta mensagem de erro:Minha solução foi alterar meu segundo procedimento armazenado para usar o novo nome:
Aqui está uma maneira simples de verificar se você tem esse problema. Clique para modificar o texto do procedimento armazenado e, em seguida, execute esse texto. Se você receber um aviso como este, precisará renomear seu procedimento armazenado:
Esta pergunta tem alguns anos, mas eu só quero lançar outra possibilidade para qualquer pessoa como eu que a encontrou mais tarde.
Executei este comando: EXEC SP_CONFIGURE 'Agent XPs'
E obtive o erro descrito: Msg 2812, Level 16, State 62, Line 1 Could not find stored procedure 'SP_CONFIGURE'.
Mas então me lembrei que este servidor está configurado para diferenciar maiúsculas de minúsculas. Portanto, este comando funcionou bem: EXEC sp_configure 'Agent XPs'
HTH
De maneira semelhante, recebi esse erro ao chamar do código ASP.NET VB por trás e foi devido a um caractere de espaço extra na frente do nome do procedimento armazenado, por exemplo, "dbo.mysproc" em vez de "dbo.mysproc".
A resposta do @Zane é a melhor resposta. Vou adicionar também... Para quem está no Azure Data Studio, você pode limpar o cache
CTRL<CMD>-SHIFT-P
digitandointellisense
o comando palato. Você verá uma opção para atualizar o cache lá. fonte