Ошибка, которую вы получаете, не имеет ничего общего с динамическим SQL. Вы не можете создать хранимую процедуру, которая использует определяемый пользователем тип данных (MyTable
в вашем примере) в той же процедуре, которая будет создавать ТИП. ТИП уже должен быть создан до того, как процедура позволит компилировать код.
Рассмотрим этот упрощенный код:
CREATE PROCEDURE TypeTest
AS
CREATE TYPE MyTable AS TABLE ([Id] int);
DECLARE @mt AS MyTable;
Просто выполнение этого даст ошибку:
Сообщение 2715, уровень 16, состояние 3, процедура TypeTest, столбец строки 1,
параметр или переменная # 1: не удается найти тип данных MyTable. Параметр или
переменная '@mt' имеет недопустимый тип данных.
Вам нужно СОЗДАТЬ ТИП вне кода процедуры, прежде чем пытаться создать процедуру. Не имеет смысла СОЗДАТЬ ТИП внутри кода процедуры, поскольку объекты ТИПА являются постоянными на сервере до тех пор, пока они в любом случае не будут удалены, а процедуры обычно создаются для многократного запуска.
Было бы неплохо, если бы SQL Server сообщал об этом больше об ошибке, но SQL Server не известен наличием самых полезных сообщений об ошибках.