我遇到一个奇怪的问题,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模式执行部署脚本。关于我为什么会收到上述错误的任何想法?
提前致谢!
答案 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));