Sql server 如何在TSQL中提取两个特殊的不同字符之间的字符串

Sql server 如何在TSQL中提取两个特殊的不同字符之间的字符串,sql-server,tsql,substring,charindex,Sql Server,Tsql,Substring,Charindex,我使用的代码来自以下问题: 当前结果: ServerName_1.domain.net;ServerName_2. 我想搜索一列/字符串,并提取从“:”开始到第一个“.”的字符串 我试图得到的结果是:ServerName_1 需要注意的是,服务器名称的长度会有所不同 另外,当我尝试运行以下查询时: SELECT SUBSTRING(Column_Name, CHARINDEX(':', Column_Name) + 1, LEN(Column_Name) - CHARINDEX(':',

我使用的代码来自以下问题:

当前结果:

ServerName_1.domain.net;ServerName_2.
我想搜索一列/字符串,并提取从“:”开始到第一个“.”的字符串

我试图得到的结果是:ServerName_1

需要注意的是,服务器名称的长度会有所不同

另外,当我尝试运行以下查询时:

SELECT 
SUBSTRING(Column_Name, CHARINDEX(':', Column_Name) + 1, LEN(Column_Name) - CHARINDEX(':', Column_Name) - CHARINDEX(':', Column_Name))
FROM [dbo].[ServerNameTable] 
我得到以下错误:

Msg 537, Level 16, State 3, Line 1
Invalid length parameter passed to the LEFT or SUBSTRING function.
非常感谢


这假设冒号和后续点始终存在

declare @Sample as VarChar(100) =
  'Microsoft.SystemCenter.UserActionManager:ServerName_1.domain.net;ServerName_2.domain.net';

with FiendishThingy as (
  select Substring( @Sample, CharIndex( ':', @Sample ) + 1, Len( @Sample ) - CharIndex( ':', @Sample ) ) as AfterColon )
  select Substring( AfterColon, 1, CharIndex( '.', AfterColon ) - 1 ) as ServerName
    from FiendishThingy;

这假设冒号和后续点始终存在

declare @Sample as VarChar(100) =
  'Microsoft.SystemCenter.UserActionManager:ServerName_1.domain.net;ServerName_2.domain.net';

with FiendishThingy as (
  select Substring( @Sample, CharIndex( ':', @Sample ) + 1, Len( @Sample ) - CharIndex( ':', @Sample ) ) as AfterColon )
  select Substring( AfterColon, 1, CharIndex( '.', AfterColon ) - 1 ) as ServerName
    from FiendishThingy;

这将取代一切,包括第一个:使用东西。然后它使用相同的结果来找到第一个。然后将填充结果子串到第一个


这将取代一切,包括第一个:使用东西。然后它使用相同的结果来找到第一个。然后将填充结果子串到第一个


首先需要获取从冒号开始的子字符串,然后使用该子字符串定位其中的第一个点(如果有),并获取该子字符串。事实上,从原始字符串的开头选择第一个冒号和第一个点,这根本不行。您的第二个查询失败,因为您将冒号的字符索引减去了两次。首先需要获取以冒号开头的子字符串,然后使用该子字符串定位其中的第一个点(如果有),然后获取该子字符串。事实上,从原始字符串的开头选择第一个冒号和第一个点,这根本不行。第二个查询失败,因为您将冒号的字符索引减去两次。
DECLARE @c varchar(100)
SET     @c = 'Microsoft.SystemCenter.UserActionManager:ServerName_1.domain.net;ServerName_2.domain.net'

SELECT SUBSTRING(STUFF(@c, 1, CHARINDEX(':',@c), ''), 0, CHARINDEX('.', STUFF(@c, 1, CHARINDEX(':',@c), '')))