"Não foi possível encontrar o procedimento armazenado ', mesmo que o procedimento armazenado tenha sido criado no MS SQL Server Management Studio

21

Eu criei uma tabela testtabledentro do banco de dados testbaseque 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 da testtable_pricesmallerseguinte maneira

use testbase
go
create procedure testtable_pricesmaller
    @pricelimit money
as
select * from testtable where price = @pricelimit;
go

e podem exibir os procedimentos armazenados no Object ExplorerMicrosoft SQL Server Management Studio. (Ele 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 poderia estar faltando?

Jack
fonte
Você se certificou de que sua instrução execute está sendo executada no contexto do banco de dados "testbase"? Você pode tentar adicionar uma instrução USE ou qualificar totalmente o nome do objeto.
Shawn Melton
Sim, adicionei a USEdeclaração, mas ela me deu o erro.
Jack
Eu tive que definir explicitamente o nome do banco de dados na minha instrução execute: EXEC [testbase]. [Dbo]. [Testtable_pricesmaller] 50
Jroonk

Respostas:

17

O cache local de atualização do IntelliSense deve corrigi-lo

user63684
fonte
7

Não é necessário reiniciar o banco de dados após adicionar um novo procedimento armazenado, embora seja necessário atualizar o explorador de objetos para vê-lo lá.

Na próxima vez que você adicionar um procedimento armazenado, tente executar a opção de execução com o botão direito do mouse no explorador de objetos, insira seus parâmetros e veja se ele é executado. Se não funcionar, não tenho certeza qual é o seu problema. Se ele for executado, pode ser algo simples, como o SQL está tentando consultar no banco de dados errado.

Zane
fonte
4

Por fim, sei por que a mensagem aparece no MS SQL Server Management Studio.

O MS SQL Server Management Studio exige que você o reinicie após a criação de um procedimento armazenado.

Depois de reiniciar o MS SQL Server Management Studio, não existe mais esse erro.

(Estranho, isso significa que toda vez que eu crio um procedimento armazenado, tenho que reiniciá-lo?)

Jack
fonte
12
Você não precisa reiniciar.
Shawn Melton
1
@ ShawnMelton, quero dizer que fecho o MS SQL Server Management Studio e reabra o MS SQL Server Management Studio. Acho estranho que eu tenha que fechar e reabri-lo. Existe alguma configuração do SSMS (MS SQL Server Management Studio) que possa estar ausente, resultando na impossibilidade de o SSMS refletir que o Procedimento Armazenado já foi criado?
Jack
5
O IntelliSense é a única parte atrasada do que você fez. A execução da instrução exec deveria ter funcionado sem reiniciar o SSMS. Há algo mais que contribuiu para que não funcionasse. Eu concordo com @ ShawnMelton.
Thomas Stringer
@ Shark, Interessante! Gostaria que alguém me explicasse por que meu SSMS se comporta de tal maneira que eu acho isso muito estranho.
Jack
6
Para referência futura: Ctrl-Shift-R atualizará o cache local, para o intellisense.
Adam Scharp
3

Seu comando create deve ser

create procedure dbo.testtable_pricesmaller
    @pricelimit money

você está ausente 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.

Saim Saboor
fonte
3

No SQL Server 2008, quando logado 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 \ nome de usuário]. [ObjectName ] em vez de [dbo]. [ObjectName] (acho que foi corrigido no SQL Server 2012).

Ocorreu um 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; portanto, o restante do procedimento estava travando porque não conseguia acessar o objeto novamente. . Acontece que as tabelas foram criadas agora com o nome de usuário do domínio.

Aqui está a publicação da Microsoft sobre esse comportamento:

https://docs.microsoft.com/pt-br/sql/t-sql/statements/create-schema-transact-sql?view=sql-server-2017 (consulte a seção "Esquema implícito e criação de usuário")

A tabela não está sendo criada no esquema dbo

O 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 tem o problema como eu acabei de descrever.

Philippe
fonte
2

Eu sei que isso é velho; Me deparei com essa pergunta enquanto procurava uma solução para esse mesmo problema, e estou postando essa resposta na esperança de que ajude outras pessoas que também encontram essa pergunta.

No meu caso, recebi a mensagem de erro ao executar um relatório SSRS usando uma fonte de dados compartilhada. Essa fonte de dados compartilhada não especificou um banco de dados padrão (o Catálogo Padrão = parâmetro) e não foi possível adicioná-lo à cadeia de conexão porque não tenho a senha (e quando você altera algo em uma fonte de dados SSRS, ela tende a para que você digite novamente a senha).

Para resolver isso, alterei o banco de dados padrão para o logon na instância do SQL Server de mestre para o banco de dados que contém o procedimento armazenado que o relatório deseja executar.

Ao executar as coisas do SSMS, lembre-se de que o painel Pesquisador de Objetos é uma conexão, enquanto qualquer editor que você possui é uma conexão totalmente diferente. Portanto, você pode ver os objetos para SQL01 no Pesquisador de Objetos, mas o código que você está executando em um editor será executado em SQL02 - já deparei com esse problema algumas vezes ao longo dos anos e depois de muitas discussões e "Por que não funciona?" percebi meu erro. Para o editor, olhe no canto inferior direito para ver a qual instância e banco de dados você está conectado.

SM
fonte
1

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:

create procedure dbo.MyProc
    ...

Criei outro procedimento armazenado que executou o primeiro

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc
    ...

Algum tempo depois, mudei o nome dbo.MyProcpara dbo.MyProc2. Depois de renomeá-lo, quando tentava ligar dbo.MyProcCaller, recebia a seguinte mensagem de erro:

exec dbo.MyProcCaller

Não foi possível encontrar o procedimento armazenado 'RLM.usp_getSecondaryRestrictedLists_Old'.

Minha solução foi alterar meu segundo procedimento armazenado para usar o novo nome:

create procedure dbo.MyProcCaller
    ...
    exec dbo.MyProc2
    ...

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 esse, precisará renomear seu procedimento armazenado:

O módulo 'dbo.MyProcCaller' depende do objeto ausente 'dbo.MyProc'. O módulo ainda será criado; no entanto, ele não pode ser executado com êxito até que o objeto exista.

(1 linha (s) afetada)

user2023861
fonte
0

Essa pergunta tem alguns anos, mas eu só quero colocar outra possibilidade para alguém como eu que a encontrou mais tarde.

Executei este comando: EXEC SP_CONFIGURE 'Agent XPs'

E obteve o erro descrito: Mensagem 2812, nível 16, estado 62, linha 1 Não foi possível encontrar o procedimento armazenado 'SP_CONFIGURE'.

Mas lembrei que este servidor está configurado para fazer distinção entre maiúsculas e minúsculas. Portanto, este comando funcionou bem: EXEC sp_configure 'Agent XPs'

HTH

jrdevdba
fonte