Удаление SQL Server после первого появления

Я ищу базу данных SCCM для опубликованных приложений

Я получаю этот вывод

163net_YoudaoDictionary_5.0_ZH_x32_CN_W10 

Но я хочу, чтобы это было

 163net YoudaoDictionary 5.0 

Так что мне нужен метод для удаления всего после _XX (были XX – некоторые строки)

Я использовал PATINDEX('%_[AZ]%',la.DisplayName) чтобы обнаружить появление _XX, но как проинструктировать функцию LEFT для удаления всех после результатов PATINDEX> 1

Использовать это:

 DECLARE @DataSoruce TABLE ( [value] NVARCHAR(4000) ); INSERT INTO @DataSoruce ([value]) VALUES ('163net_YoudaoDictionary_5.0_ZH_x32_CN_W10') SELECT REPLACE(SUBSTRING([value], 0, PATINDEX('%[_][AZ][AZ]%',[value] COLLATE Latin1_General_100_BIN2)), '_', ' ') FROM @DataSoruce; 

Попробуй это:

 declare @str varchar(100) set @str = '163net_YoudaoDictionary_5.0_ZH_x32_CN_W10' select REPLACE(LEFT(@str, PATINDEX('%[_][AZ][^az]%',@str COLLATE SQL_Latin1_General_CP1_CS_AS) - 4), '_', ' ') 

По сути, вам нужно такое регулярное выражение '%[_][AZ][^az]%' чтобы найти то, что вам нужно, и установить сортировку строки, поиск которой SQL_Latin1_General_CP1_CS_AS от регистра, например SQL_Latin1_General_CP1_CS_AS .

Вы можете использовать функцию Patindex() функцией Patindex() чтобы найти шаблон (т.е. _XX) и заменить на ' ' а затем заменить '_' на ' '

 DECLARE @DATA NVARCHAR(MAX) SET @DATA = '163net_YoudaoDictionary_5.0_ZH_x32_CN_W10' SELECT REPLACE(REPLACE(@DATA, SUBSTRING(@DATA, PATINDEX('%_ZH%', @DATA), LEN(@DATA)), ''), '_', ' '); 

Результат:

 163net YoudaoDictionary 5.0 

Если ваша строка всегда совпадает с форматом и длиной, вы можете использовать функции SUBSTRING() и REPLACE() :

 DECLARE @Type NVARCHAR(MAX) = N'163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'; SELECT SUBSTRING(REPLACE (@Type, '_', ' '), 0, 28) AS Result; 

Используйте REPLACE (), чтобы заменить _ пробелом ' ' .

Используйте SUBSTRING (), чтобы вырезать нужную строку из вашей строки.

Если вы хотите использовать PATINDEX() :

 SELECT REPLACE(SUBSTRING(@Type, 0, PATINDEX('%[_][AZ][AZ][_]%', @Type) ), '_', ' ') AS Result; 

Обновить:

Вы не представили пример данных, но вот пример:

 CREATE TABLE MyData ( STR NVARCHAR(MAX) ); INSERT INTO MYData VALUES (N'163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'), (N'164net_YoudaoDictionary_4.0_HZ_x86_CN_W10_UD78_KIU7'), (N'165net_YoudaoDictionary_4.1_ZH_x32'), (N'166net_YoudaoDictionary_3.0_LF_x32_KO_X16'), (N'167net_YoudaoDictionary_1.0_EX_x86_RW_B28'); SELECT REPLACE(SUBSTRING(STR, 0, PATINDEX('%[_][AZ][AZ][_]%', STR) ), '_', ' ') AS Result FROM MyData; 

Результат:

 +-----------------------------+ | Result | +-----------------------------+ | 163net YoudaoDictionary 5.0 | | 164net YoudaoDictionary 4.0 | | 165net YoudaoDictionary 4.1 | | 166net YoudaoDictionary 3.0 | | 167net YoudaoDictionary 1.0 | +-----------------------------+ 

Пример таблицы:

 DECLARE @temp TABLE ( string nvarchar(max) ) INSERT INTO @temp VALUES (N'163net_YoudaoDictionary_5.0_ZH_x32_CN_W10'), (N'157org_WhateverDictionary_7.0_smth_KJ_x64_WN_W7'), (N''), (NULL) 

Автор сценария:

 SELECT RTRIM(REPLACE(LEFT(string,PATINDEX('%[_][AZ][AZ][_]%',string COLLATE Latin1_General_100_BIN2)),'_',' ')) FROM @temp 

Вывод:

 (No column name) 163net YoudaoDictionary 5.0 157org WhateverDictionary 7.0 smth NULL 

Объяснение:

Наверное, вы знаете, что означает RTRIM , REPLACE , LEFT , PATINDEX . И COLLATE Latin1_General_100_BIN2 двоичная сортировка означает, что поиск представляет собой прямое сравнение байтов, что, по-видимому, быстрее. Подробнее здесь .

Хорошо, я нашел решение: в базе данных SCCM есть представление fn_LocalizedAppProperties (1033), название столбца, необходимо связать его с fn_ListLatestApplicationCI (1033) с помощью CI_ID

Спасибо всем за предложения!

Давайте будем гением компьютера.