【问题标题】:SQL: Must declare scalar variableSQL:必须声明标量变量
【发布时间】: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


【解决方案1】:

正如 Aaron Bertrand 的评论所详述的,该问题是由于数据库的兼容模式造成的。将兼容性更改为 90 (SQL Server 2005) 解决了该问题。兼容模式为 80 (SQL Server 2000) 的数据库不支持 UDT 等较新功能。

有关兼容模式的效果和行为的更多详细信息,请参阅此线程here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多