使用用户定义的表类型和生成的数据库部署脚本的问题

时间:2011-08-20 17:27:28

标签: sql-server database visual-studio-2010 deployment database-project

我遇到一个奇怪的问题,VS2010的数据库项目无法执行生成的部署脚本,该脚本在SP的参数列表中使用用户定义的表类型。执行部署脚本时出现以下错误:

  

错误SQL01268:.Net SqlClient数据提供程序:消息137,级别16,状态1,过程AppSearch,第36行必须声明标量变量“@platforms”。

此处的 @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 个答案:

答案 0 :(得分:1)

考虑表类型应该像表一样。你不能说“如果TABLE不是NULL”那么为什么你能说“如果TABLE TYPE是非NULL”?我没有广泛使用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));