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

问题描述 投票:0回答:2

我不太喜欢数据库,我发现以下困难。我正在开发一个相当旧版本的 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 Server 版本支持的类似内容吗?

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

sql sql-server database sql-server-2008 sql-server-2008-r2
2个回答
4
投票

用我自己的猜测填补一些空白,但根据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 的一个非常旧的版本。 2008R2 的 SP3 不久前发布,而 SP2 并未针对 Spectre 和 Meltdown 漏洞进行修补。即使您暂时没有更新 SQL Server 的版本(应该重新考虑),我也强烈建议您将该服务器更新到 SP3 GDR。如果您所在的国家/地区有 GDPR(或类似)立法,则尤其如此,因为您的地方当局会将未修补(且不受支持)的软件视为一个巨大的问题,并且不会在以下结果中很好地反映在预防措施列表中:违反。


0
投票

declare @vDate DATETIME BEGIN TRY SELECT @vDate = CONVERT(datetime, '12/31/2010') END TRY BEGIN CATCH SELECT @vDate = null END CATCH SELECT @vDate BEGIN TRY SELECT @vDate = CONVERT(datetime, 'eggs') END TRY BEGIN CATCH SELECT @vDate = null END CATCH SELECT @vDate

© www.soinside.com 2019 - 2024. All rights reserved.