Как использовать временную таблицу с динамическим SQL? - PullRequest
0 голосов
/ 25 января 2019

Я хочу использовать временную таблицу с динамическим sql, но у меня есть ошибка, говорящая, что столбец Column, parameter, or variable #3: Cannot find data type MyTable. Must declare the table variable "@CountriesFound".

Вот мой код

ALTER PROCEDURE sqlDynamic @countryId int
AS

CREATE TYPE MyTable AS TABLE ([countries] varchar(50));

DECLARE @statement NVARCHAR(MAX)
DECLARE @CountriesFound AS MyTable

INSERT INTO @CountriesFound(countries)
select Name 
FROM CountriesFound

SET @statement =
    'SELECT name, CASE WHEN (c.name IN (SELECT countries FROM @CountriesFound)) THEN 1
                  ELSE 0
             END as countryFound FROM Country c WHERE c.countryId = @countryId'

EXECUTE sp_executesql @statement,
            N'@countryId int, @CountriesFound MyTable READONLY', 
            @countryId = @countryId,
            @CountriesFound=@CountriesFound;

Есть идеи, как это исправить?

1 Ответ

0 голосов
/ 13 марта 2019

Ошибка, которую вы получаете, не имеет ничего общего с динамическим 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 не известен наличием самых полезных сообщений об ошибках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...