Проблема с использованием пользовательского типа таблицы с созданным сценарием развертывания базы данных - PullRequest
1 голос
/ 20 августа 2011

У меня странная проблема с проектом базы данных VS2010, который не может выполнить сгенерированный сценарий развертывания, который использует определяемый пользователем тип таблицы в списке параметров SP. Я получаю следующую ошибку при выполнении сценария развертывания:

Ошибка SQL01268: поставщик данных .Net SqlClient: Msg 137, уровень 16, состояние 1, процедура AppSearch, строка 36 должна объявить скалярную переменную "@platforms".

Переменная @ платформы здесь представляет собой определяемый пользователем тип таблицы, который определяется просто так:

CREATE TYPE [dbo].[IdList] AS TABLE 
(
    Id      uniqueidentifier
);

Хранимая процедура, которую я создаю, выглядит следующим образом, которая использует UDDT в качестве одного из своих параметров:

PRINT N'Creating [dbo].[AppSearch]...';


GO
CREATE PROCEDURE [dbo].[AppSearch]
    @nameContains           nvarchar(30),
    @descriptionContains    nvarchar(max),
    @isEditorsPick          bit,
    @dateAddedStart         datetime,
    @dateAddedEnd           datetime,
    @platforms              IdList      readonly
AS
begin
    select
        l.Id as [LibraryId],
        l.Name as [LibraryName],
        l.Description as [LibraryDescription],
        c.Id as [CategoryId],
        c.Name as [CategoryName],
        c.Description as [CategoryDescription],
        a.Id as [AppId],
        a.Name as [AppName],
        a.Description as [AppDescription],
        a.IsEditorsPick as [AppIsEditorsPick],
        a.DateAdded as [AppDateAdded],
        p.Id as [PlatformId],
        p.Name as [PlatformName],
        p.Architecture as [PlatformArchitecture]
    from
        Library l
        inner join Category c               on l.Id = c.ParentLibraryId
        inner join App a                    on c.Id = a.ParentCategoryId
        inner join AppSupportedPlatform px  on a.Id = px.AppId
        inner join Platform p               on px.PlatformId = p.Id
    where
            (@nameContains is not null and a.Name like '%' + @nameContains + '%')
        and (@descriptionContains is not null and a.Description like '%' + @descriptionContains + '%')
        and (@isEditorsPick is not null and a.IsEditorsPick = @isEditorsPick)
        and (@dateAddedStart is not null and @dateAddedEnd is not null and a.DateAdded between @dateAddedStart and @dateAddedEnd)
        and (@platforms is not null and p.Id in (select Id from @platforms))
end
GO

Сценарий развертывания выполняется в режиме SQLCMD. Любые идеи о том, почему я получаю вышеуказанную ошибку?

Заранее спасибо!

1 Ответ

1 голос
/ 20 августа 2011

Учтите, что тип таблицы должен вести себя как таблица.Вы не можете сказать «если TABLE НЕ НЕДЕЙСТВИТЕЛЕН», так почему вы должны быть в состоянии сказать «если TABLE TYPE НЕ НЕДЕЙСТВИТЕЛЕН»?Я не очень широко использовал TVP, но как насчет проверки того, что TVP не пустой:

AND (EXISTS (SELECT 1 FROM @platforms) AND p.Id IN (SELECT Id FROM @platforms));

Последнее может быть достаточно (опять же, это скорее из-за отсутствия игры с TVP, чем чем-либо еще) или, может быть:

AND (p.Id IN (SELECT Id FROM @platforms) OR NOT EXISTS (SELECT 1 FROM @platforms));
...