Функция разделения с перекрестным применением в SQL Server - PullRequest
0 голосов
/ 08 января 2019

Мне нужно разделить переменную как, exp

declare @testString varchar(100)

set @testString = ' Agency=100|Org=2112|RepOrg=2112|SubOrg= |Fund=0137|Approp=6755|Object= |SubObject= |Activity= |Function= |Job= |ReportingCat= '

select 
    y.items 
from 
    dbo.Split(@testString, '|') x 
cross apply 
    dbo.Split(x.items, '=') y

Приводит к ошибке:

Сообщение 102, Уровень 15, Состояние 1, Строка 7
Неверный синтаксис рядом с '.'.

Не уверен, куда я иду не так.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Может быть, вам нужно что-то вроде этого: -

enter image description here

DECLARE @testString VARCHAR(100)

SET @testString = 
    ' Agency=100|Org=2112|RepOrg=2112|SubOrg= |Fund=0137|Approp=6755|Object= |SubObject= |Activity= |Function= |Job= |ReportingCat= '

SELECT X.VALUE  AS ACTUALVALUE,
       SUBSTRING(
           X.VALUE,
           1,
           CASE 
                WHEN CHARINDEX('=', X.VALUE) = 0 THEN LEN(X.VALUE)
                ELSE CHARINDEX('=', X.VALUE) -1
           END
       )                                 AS FIELD,
       SUBSTRING(X.VALUE, CHARINDEX('=', X.VALUE) + 1, 10) AS VALUE
FROM   string_split(@testString, '|') x 
0 голосов
/ 08 января 2019

Я использовал ту же функцию, которую вы использовали dbo.split. Чтобы получить вывод (Агентство в одном столбце и код в другом), вы можете использовать подстроку вместе с индексом символа, который поможет вам разбить на два столбца.

Несколько изменений, которые я внес в ваш скрипт: Изменена длина с 100 до 250, так как она усекала строку, и убрал еще один крест, применяемый при создании дубликатов.

declare @testString varchar(250)
set @testString = 'Agency=100|Org=2112|RepOrg=2112|SubOrg= 
|Fund=0137|Approp=6755|Object= |SubObject= |Activity= |Function= |Job= |ReportingCat='

select substring( (x.items),1, 
case when  CHARINDEX('=',  x.items) = 0 then LEN(x.items) 
 else CHARINDEX('=', x.items) -1 end ) Agency ,   
 substring( (x.items),  
 case when  CHARINDEX('=',  x.items) = 0 then LEN(x.items) 
 else CHARINDEX('=', x.items) +1 end,len(x.items) -
 case when  CHARINDEX('=',  x.items) = 0 then LEN(x.items)  
  else CHARINDEX('=', x.items)-1  end) as Code   from dbo.split 
  (@testString, '|') x 

Он работал без ошибок, и эта функция здесь, как упоминал Бен. https://social.msdn.microsoft.com/Forums/en-US/bb2b2421-6587-4956-aff0-a7df9c91a84a/what-is-dbosplit?forum=transactsql

Вывод, который я получаю:

  Agency    Code
  Agency    100
  Org       2112
  RepOrg    2112
  SubOrg        
  Fund      0137
  Approp    6755
  Object     
  SubObject  
  Activity   
  Function   
  Job    
  ReportingCat    
...