Разделение значения столбца на «\» на сервере Sql

У меня есть некоторые данные в столбце FileFullPath

Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\Oracle\2022-05-04\MSudaitemlov_20220503
Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OracleABC\2022-05-04\FDERDMSudaitemlov_20220503
Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OCSBAGF\2022-05-04\AASSSMSudaitemlov_20220503

Часть, которую я хотел, это:

Oracle
OracleABC
OCSBAGF

Буквы dynamic, поэтому я не смог применить функцию Left,Right, так как длина другая. Я попытался разделить его с помощью '\' с помощью STRING_SPLIT(), но он говорит:

Msg 195, Level 15, State 10, Line 18
'string_split' is not a recognized built-in function name.

Какую версию SQL Server вы используете? Если STRING_SPLIT не распознается, вы используете SQL Server 2014 или более раннюю версию.

Larnu 06.05.2022 11:40

Отвечает ли это на ваш вопрос? Используя T-SQL, верните n-й элемент с разделителями из строки

Larnu 06.05.2022 11:41

это версия 18.9.1

Dikshit Karki 06.05.2022 11:42

SQL Server 18.9.1 не существует; последняя версия SQL Server — 15.0.4223.1, то есть SQL Server 2019 CU 16.

Larnu 06.05.2022 11:44

это Microsoft SQL Server 2016

Dikshit Karki 06.05.2022 11:48
STRING_SPLIT был добавлен в SQL Server 2016, поэтому вы сможете его использовать. Хотя, по правде говоря, вам это не поможет, поскольку он не обеспечивает порядкового номера. Хотя я связал вас с вопросом о том, как вы можете получить n-е значение.
Larnu 06.05.2022 11:50

Я не могу визуализировать ссылку, которую вы разместили @Larnu

Dikshit Karki 06.05.2022 11:52

Он разбивается на разные строки, но мне нужна только извлеченная часть для каждой из строк.

Dikshit Karki 06.05.2022 11:54

Так как же узнать, какая часть вам нужна? И, что более важно, откуда SQL Server знает?

Larnu 06.05.2022 11:54

Если мы ищем закономерность, есть ли она? Глядя с конца обратного слова, всегда ли строка имеет имя, дату, а затем строковое значение, которое вы хотите? Если вы перевернете строку, вы можете разделить ее с помощью функции, которая предоставляет позицию, а затем просто взять третью часть. А разбиение строк - САМЫЙ РАСПРОСТРАНЕННЫЙ вопрос - было опубликовано множество функций, которые работают во всех версиях сервера sql.

SMor 06.05.2022 13:07
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы должны иметь возможность использовать STRING_SPLIT() в SQL Server 2016, за исключением двух сценариев:

  1. Если вы неправильно вызываете функцию, многие люди пытаются вызывать ее как скалярную функцию (SELECT STRING_SPLIT(...), а не как функцию с табличным значением (SELECT * FROM STRING_SPLIT(...). Он возвращает таблицу, поэтому вы должны обращаться с ней как с таблицей.
  2. Если уровень совместимости вашей базы данных ниже 130. Это называется в самом верху документации, и я дал несколько обходных путей в этот совет в случаях, когда вы не можете изменить уровень совместимости.

Но STRING_SPLIT() все равно не решит эту проблему...

... потому что порядок вывода не гарантируется, поэтому вы никогда не сможете надежно определить, какой элемент является третьим от последнего.

Беззастенчиво позаимствовав мою работу в Эта статья, вы можете создать следующую простую функцию:

CREATE FUNCTION dbo.SplitOrdered_JSON
(
  @List      nvarchar(4000),
  @Delimiter nvarchar(255)
)
RETURNS table WITH SCHEMABINDING
AS
  RETURN
  (
    SELECT [key], value FROM OPENJSON
    (
      CONCAT
      (
        N'["',
        REPLACE(STRING_ESCAPE(@List, 'JSON'), 
          @Delimiter, N'","'),
        N'"]')
      ) AS x
    );

Затем, если вам нужен 3-й последний элемент в строке, вы можете просто изменить его перед синтаксическим анализом, а затем снова изменить после синтаксического анализа. например

CREATE TABLE #f(ID int, FullFilePath nvarchar(4000));

INSERT #f VALUES
(1,N'Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\Oracle\2022-05-04\MSudaitemlov_20220503'),
(2,N'Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OracleABC\2022-05-04\FDERDMSudaitemlov_20220503'),
(3,N'Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OCSBAGF\2022-05-04\AASSSMSudaitemlov_20220503');

DECLARE @ElementOfInterest int = 3;

SELECT REVERSE(value) 
  FROM #f CROSS APPLY dbo.SplitOrdered_JSON(REVERSE(FullFilePath), N'\')
  WHERE [key] = @ElementOfInterest - 1;

Вот еще одно решение для полного покрытия.

Он будет работать, начиная с SQL Server 2012 и далее.

Он использует XML и XQuery для токенизации. Нет необходимости в каких-либо определяемых пользователем функциях (UDF).

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY, FullFilePath nvarchar(4000));
INSERT INTO @tbl (FullFilePath) VALUES
(N'Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\Oracle\2022-05-04\MSudaitemlov_20220503'),
(N'Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OracleABC\2022-05-04\FDERDMSudaitemlov_20220503'),
(N'Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OCSBAGF\2022-05-04\AASSSMSudaitemlov_20220503');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = '\'
    , @token int = 8;

SELECT t.* 
    , c.value('(/root/r[sql:variable("@token")]/text())[1]', 'NVARCHAR(20)')
FROM @tbl AS t
CROSS APPLY (SELECT TRY_CAST('<root><r><![CDATA[' + 
      REPLACE(FullFilePath, @separator, ']]></r><r><![CDATA[') + 
      ']]></r></root>' AS XML)) AS t1(c);

Выход

+----+--------------------------------------------------------------------------------------------------------+------------------+
| ID |                                              FullFilePath                                              | (No column name) |
+----+--------------------------------------------------------------------------------------------------------+------------------+
|  1 | Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\Oracle\2022-05-04\MSudaitemlov_20220503         | Oracle           |
|  2 | Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OracleABC\2022-05-04\FDERDMSudaitemlov_20220503 | OracleABC        |
|  3 | Y:\dfs-dc-01\Split\Retail\Kroger\Kroger\FTP-FromClient\OCSBAGF\2022-05-04\AASSSMSudaitemlov_20220503   | OCSBAGF          |
+----+--------------------------------------------------------------------------------------------------------+------------------+

Что ж, вам также не «нужен» UDF для решения JSON, но он, безусловно, делает запрос более аккуратным (без снижения производительности), поэтому не уверен, зачем его устранять.

Aaron Bertrand 06.05.2022 19:01

Я согласен. Модель данных XML основана на упорядоченных последовательностях. Модель данных JSON основана на массивах. Так что они оба идеально подходят для таких задач. Хотя у JSON нет реальных API, таких как XPath. XQuery и проверка XSD.

Yitzhak Khabinsky 06.05.2022 19:29

Другие вопросы по теме