我不太喜欢数据库,发现以下困难。我正在使用旧版本的 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版本支持的类似内容替换它?
答案 0 :(得分: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的真正旧版本。 SP3早在2008R2上发布的,并且未补丁了Spectre和Meltdown漏洞。即使您暂时不更新SQL Server的版本(应该重新考虑),我也不能更强烈地建议您将该服务器更新为SP3 GDR。如果您所在的国家/地区拥有GDPR(或类似法规)法规,则尤其如此,因为您的地方政府将把未打补丁(和不受支持)的软件视为一个大问题,并且由于以下原因将无法很好地反映在预防措施列表中违反。