奇怪的错误消息:“将TVP参数传递给表值函数时必须声明标量变量”

时间:2013-09-16 09:38:59

标签: sql-server-2008

我有一个简单的自定义类型,可以将它用作表值参数。 像这样:

 CREATE TYPE dbo.PeriodsList AS TABLE
    (
        PeriodDate NVARCHAR(8) NOT NULL
    )

我也有非常简单的表值函数:

alter FUNCTION GetPeriodsInYear (@periods  dbo.PeriodsList READONLY) returns @PeriodsSet Table(period NVARCHAR(8))

BEGIN
insert @PeriodsSet
select 
    '0' as period 
Return
end

但是当我尝试以这种方式执行这个功能时

DECLARE @periods1 dbo.PeriodsList
INSERT INTO @periods1
VALUES ('20130916')

select * from GetPurchasesInYear(@periods1)

我收到错误消息 - “必须声明标量变量”@ periods1“。 我发现了许多关于存储过程的例子,但没有关于函数的例子是否可以将表值参数传递给函数? 我代码中的错误在哪里?

1 个答案:

答案 0 :(得分:1)

检查"兼容级别"您的SQL Server 2008数据库。如果它设置为80(SQL Server 2000),当您尝试调用带有表值参数的函数(但不是存储过程)时,您将收到所描述的错误。

如果兼容级别值为90(SQL Server 2005)或更高,则应该可以使用。

要查看数据库的兼容级别,请执行以下操作:

SELECT compatibility_level
FROM sys.databases 
WHERE name = 'YOUR_DB_NAME_HERE';

来源:http://msgroups.net/microsoft.public.sqlserver.programming/pass-table-valued-para/97879

更改兼容级别(SQL Server 2008):http://technet.microsoft.com/en-us/library/bb510680%28v=sql.100%29.aspx