【问题标题】:How can I replace not supported TRY_CONVERT function on an old SQL Server 2008 version?如何替换旧 SQL Server 2008 版本上不支持的 TRY_CONVERT 函数?
【发布时间】:2019-12-31 16:34:09
【问题描述】:

我不太喜欢数据库,我发现以下困难。我正在开发一个相当旧版本的 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.

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

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

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

【问题讨论】:

  • 请向我们展示样本数据。在大多数情况下,TRY_CONVERT 无法做到普通CONVERT 也无法做到。
  • 您能发布一些无法转换的示例值吗?一种解决方案是检测无法转换为 hierarchyid 的字符串并跳过它们。
  • TRY_CONVERT 是在 SQL Server 2012 中添加的。文档不会告诉您这一点,因为 SQL Server 2008 现在完全不支持了;所以TRY_CONVERT 在所有支持的 SQL Server 版本中都可用。
  • 你的自定义数据类型hierarchyId的定义是什么?
  • 仅供参考,这是this question的后续内容。

标签: sql sql-server database sql-server-2008 sql-server-2008-r2


【解决方案1】:

在这里用我自己的猜测填补一些空白,但根据 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

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

【讨论】:

  • 我正要发同样的东西...dbfiddle.uk/…
  • 如果我知道 OP 之前使用的是不受支持的 SQL Server 版本,那么我在最初的回答中就不会使用 TRY_CONVERT。我是多么的 愚蠢 假设他们正在使用受支持的技术。 >_
  • #@Larnu 它似乎工作正常。做得好 !!!但我有一些疑问:1)“OP”是什么意思? 2)您在 PROT_TITOLARIO 表(别名为 PT)上进行选择,但 CROSS APPLY 的含义是什么?我读到这有点像 JOIN,但我看不出确切的含义....对不起,我不喜欢 DB,我需要了解它是如何工作的
  • 你在这里怀疑什么,你实际上并没有说,@AndreaNobili。关于您的其他问题:“OP”=“原始海报”。 APPLY 允许在FROM 中使用相关子查询,在这种情况下,我将它与VALUES 运算符一起使用以在FROM 中应用表达式;这意味着我不需要在SELECTWHEREORDER BY 中重复它们(尽管您可以通过ORDER BY 中的别名来引用列)。
  • 你最常发现APPLY 与函数一起使用,因为你不能做类似FROM MyTable MT JOIN STRING_SPLIT(MT.MyColumn,',') 的事情,因为MT.MyColumn 在函数的上下文中是不知道的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 2013-04-20
相关资源
最近更新 更多