Sql server 2008 r2 ';对象"模式"名称';不是可识别的内置函数名

Sql server 2008 r2 ';对象"模式"名称';不是可识别的内置函数名,sql-server-2008-r2,Sql Server 2008 R2,我正在尝试运行一个脚本在SQLServer2008R2上设置tsqlt,并收到此错误 “对象\架构\名称”不是可识别的内置函数名称 在另一台使用SQL 2008 r2的计算机上,脚本运行良好 我看不到每台机器在sql server设置中的用户或权限有任何差异 这是引发错误的语句: CREATE FUNCTION tSQLt.Private_GetOriginalTableInfo(@TableObjectId INT) RETURNS TABLE AS RETURN SELECT C

我正在尝试运行一个脚本在SQLServer2008R2上设置tsqlt,并收到此错误

“对象\架构\名称”不是可识别的内置函数名称

在另一台使用SQL 2008 r2的计算机上,脚本运行良好

我看不到每台机器在sql server设置中的用户或权限有任何差异

这是引发错误的语句:

    CREATE FUNCTION tSQLt.Private_GetOriginalTableInfo(@TableObjectId INT)
RETURNS TABLE
AS
  RETURN SELECT CAST(value AS NVARCHAR(4000)) OrgTableName,
    OBJECT_ID(QUOTENAME(OBJECT_SCHEMA_NAME(@TableObjectId)) 
    + '.' + QUOTENAME(CAST(value AS NVARCHAR(4000)))) OrgTableObjectId
    FROM sys.extended_properties
   WHERE class_desc = 'OBJECT_OR_COLUMN'
     AND major_id = @TableObjectId
     AND minor_id = 0
     AND name = 'tSQLt.FakeTable_OrgTableName';
GO

如果这实际上是在SQL Server 2008 R2上,则您的数据库处于SQL Server 2000兼容模式。您可以知道您现在处于什么模式:

SELECT name, compatibility_level
  FROM sys.databases
  WHERE name = N'your_database';
如果这是80,则需要向上移动(但这需要测试):

如果无法向上移动,则始终可以通过加入
sys.schemas
而不是依赖内置函数来获取架构名称



也就是说,如果您使用的是SQLServer2005RTM(如注释中所示)。您不应该再在SQLServer2005RTM上运行任何系统。您将能够使用此功能。

我如何知道它当前处于什么兼容模式?哦,我现在看到了。9.0.1399@JonnyCundall你在哪里看到的?似乎是SQLServer2005,而不是SQLServer2008R2。我在ssms中看到了这一点。我想我有2008 r2 ssms,但它在看2005 sp2数据库。我以前在比较这两台机器时可能会注意到这一点!我很确定这就是问题所在,尽管有点奇怪,因为谷歌说2005SP2应该认识到这个函数。9.0.1399是2005RTM,而不是2005SP2。因此,如果您正在查看2005 RTM,它将不具有该功能,因为SP2是必需的(它就是在那里添加的)。
ALTER DATABASE your_database SET COMPATIBILITY_LEVEL = 100;