【发布时间】:2014-09-10 16:07:56
【问题描述】:
当我在 SQL Server 2012 中运行以下 T-SQL 时,它工作正常,但在 SQL Server 2008 R2 中我收到错误
必须声明标量变量“@in”
and必须声明标量变量“@out”
代码:
DECLARE @outIds nvarchar(max);
DECLARE @in TimeLineReportList;
DECLARE @out TimeLineReportList;
DECLARE @startDate datetime;
DECLARE @endDate datetime;
DECLARE @assessmentId int;
SET @startDate ='2013-01-01T00:00:00.000'
SET @endDate ='2013-01-01T00:00:00.000'
SET @assessmentId = 14
SET @outIds ='3,9,10'
INSERT INTO @in
SELECT *
FROM dbo.udf_First_Timeline_Entries_Of_Status(@assessmentId)
INSERT INTO @out
SELECT *
FROM dbo.udf_First_Timeline_Entries_Of_Any_Statuses(@outIds)
SELECT *
FROM dbo.udf_Generic_Timelines(@startDate, @endDate, @in, @out,default)
TimeLineReportList是用户定义的表类型,肯定存在于DB中
编辑我刚刚通过运行以下命令测试了前两个查询,并且都返回结果:
SELECT * FROM dbo.udf_First_Timeline_Entries_Of_Status(@assessmentId)
SELECT * FROM dbo.udf_First_Timeline_Entries_Of_Any_Statuses(@outIds)
【问题讨论】:
-
你的数据库是80兼容模式吗?这些 UDF 是 TVF 吗?还有 2008 2008 R2。
-
@AaronBertrand 肯定是 2008R2,而不是 2008。2012 实例处于 90 兼容模式,但 2008R2 实例处于 80
-
我怀疑问题出在兼容模式上——尽管我还没有验证这个确切的限制。如果您可以确认在切换到 90 时此语法错误消失,例如,我将 update this answer。 (为什么你还是 80 岁?)
-
有很多原因,但这些并不是贬义的:(1) 懒惰(您必须测试更改并可能进行代码更改)(2) 无知(如果您从 2000 年迁移数据库-> 2008 R2,除非有人知道要更改它,否则它只会保持在 80)(3)恐惧(4)知道存在的代码会在新的兼容级别上中断。
-
我宁愿将其移至 dba.se 并将其作为 this answer 的副本关闭,我已对其进行了更新以适应这种情况。
标签: sql sql-server tsql sql-server-2008-r2 sql-server-2012