Хорошо, на основании приведенного выше комментария и, по моему подозрению, кажется, что вы пытаетесь выполнить динамический SQL в рамках вашей хранимой процедуры.
Следует помнить, что когда вы делаете это, он не выполняется в контексте хранимой процедуры - он выполняется в новом сеансе. Из-за этого тот факт, что оператор вызывается внутри хранимой процедуры, является спорным вопросом, и вам необходимо предоставить явное разрешение на объекты, которые использует ваш динамический SQL.
Если вы не хотите этого делать, я бы реорганизовал вашу хранимую процедуру, чтобы не использовать динамический SQL.
Ниже ссылка от Microsoft должна помочь вам с вашей проблемой:
PRB: контекст безопасности динамических операторов SQL внутри хранимой процедуры (архив Wayback Machine)
Это происходит потому, что динамический запрос выполнения (sp_executesql или EXECUTE) выполняется в отдельном контексте от основной хранимой процедуры; он выполняется в контексте безопасности пользователя, который выполняет хранимую процедуру, а не в контексте безопасности владельца хранимой процедуры.
Это также обсуждается в (более актуальной) статье Microsoft Docs:
Написание безопасного динамического SQL в SQL Server
Выполнение динамически созданных операторов SQL в процедурном коде разрывает цепочку владения, заставляя SQL Server проверять разрешения вызывающей стороны в отношении объектов, к которым обращается динамический SQL.