如何在旧的 SQL Server 2008 版本上替换不支持的 TRY_CONVERT 函数?

How can I replace not supported TRY_CONVERT function on an old SQL Server 2008 version?

我不是很喜欢数据库,我发现了以下困难。我正在开发 SQL Server:

的相当旧的版本
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4042.0 (X64)   Mar 26 2015 21:18:04   Copyright (c) Microsoft Corporation  Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor) 

问题是我有这个查询:

SELECT [Sottocategoria]
      ,[IdSottocategoria]
      ,[IdCategoria]
      ,[Note]
FROM [dbo].[PROT_TITOLARIO]
ORDER BY TRY_CONVERT(hierarchyid,'/'+REPLACE(IdSottocategoria,'.','/')+'/')

即将出错:

Msg 195, Level 15, State 10, Line 6
'TRY_CONVERT' is not a recognized built-in function name.

我认为我无法提高数据库的兼容性级别,因为它太旧了,实际上正在做:

ALTER DATABASE GHELLA_CRI SET COMPATIBILITY_LEVEL = 110

我收到此错误消息:

Msg 15048, Level 16, State 1, Line 1
Valid values of the database compatibility level are 80, 90, or 100.

所以问题似乎是这个 TRY_CONVERT 函数似乎不被 SQL Server 2008 支持.

有没有办法用这个 SQL 服务器版本支持的类似东西替换它?

这里有一个查询示例:https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=c0650397514372818b10958901c98add

用我自己的猜测来填补一些空白,但根据 OP 的内容,我怀疑我们可以改为这样做:

SELECT *
FROM [dbo].[PROT_TITOLARIO] PT
     CROSS APPLY (VALUES(CASE WHEN PT.IdSottocategoria LIKE '%[^0-9.]%' THEN NULL ELSE PT.IdSottocategoria END)) TC(IdSottocategoria)
     CROSS APPLY (VALUES(CONVERT(hierarchyid,'/'+REPLACE(TC.IdSottocategoria,'.','/')+'/')))V(Hid)
ORDER BY CASE WHEN V.Hid IS NULL THEN 1 ELSE 0 END,
         V.Hid,
         PT.IdSottocategoria;

我使用 CASE 表达式来检查 IdSottocategoria 的值是否仅包含数值和 .,然后仅包含 CONVERT 这些值。这适用于 OP 提供的示例值:db<>fiddle

重申一下我的意见,SQL Server 2008 R2 SP2 是 SQL Server 的真正旧版本。 SP3 于前一段时间针对 2008R2 发布,SP2 针对 Spectre 和 Meltdown 漏洞进行修补。即使您暂时没有更新 SQL 服务器的版本(应该重新考虑),我也强烈建议您将该服务器更新到 SP3 GDR。如果您所在的国家/地区制定了 GDPR(或类似)立法,则尤其如此,因为您的地方当局会将未打补丁(和不受支持)的软件视为一个巨大的问题,并且不会在预防措施列表中很好地反映出来违反。