Ok, com base no comentário acima e conforme minha suspeita - parece que você está tentando executar SQL dinâmico dentro do seu procedimento armazenado.
O que você precisa lembrar é que, quando você faz isso, ele não é executado no contexto do procedimento armazenado - ele é executado em uma nova sessão. Por esse motivo, o fato de a instrução estar sendo chamada em um procedimento armazenado é um ponto discutível e você precisará conceder permissão explícita nos objetos que seu SQL dinâmico está usando.
Se você não quiser fazer isso, refatoraria seu procedimento armazenado para não usar SQL dinâmico.
O link abaixo da Microsoft deve ajudá-lo com o seu problema:
PRB: Contexto de segurança de instruções SQL dinâmicas dentro de um procedimento armazenado (arquivo Wayback Machine)
Esse comportamento ocorre porque uma consulta de execução dinâmica (sp_executesql ou EXECUTE) é executada em um contexto separado do procedimento armazenado principal; ele é executado no contexto de segurança do usuário que executa o procedimento armazenado e não no contexto de segurança do proprietário do procedimento armazenado.
Isso também é discutido no artigo (mais atual) do Microsoft Docs:
Gravando SQL dinâmico seguro no SQL Server
A execução de instruções SQL criadas dinamicamente em seu código processual interrompe a cadeia de propriedade, fazendo com que o SQL Server verifique as permissões do chamador com relação aos objetos acessados pelo SQL dinâmico.