我不太喜欢数据库,我发现以下困难。我正在开发一个相当旧版本的 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
用我自己的猜测填补一些空白,但根据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(或类似)立法,则尤其如此,因为您的地方当局会将未修补(且不受支持)的软件视为一个巨大的问题,并且不会在以下结果中很好地反映在预防措施列表中:违反。
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