我有一个简单的自定义类型,可以将它用作表值参数。 像这样:
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“。 我发现了许多关于存储过程的例子,但没有关于函数的例子是否可以将表值参数传递给函数? 我代码中的错误在哪里?
答案 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