SQL 服务器中的拆分与交叉应用功能

Split With Cross Apply function in SQL Server

我需要将变量拆分为 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

导致错误:

Msg 102, Level 15, State 1, Line 7
Incorrect syntax near '.'.

不确定我哪里出错了。

我使用了与您使用的功能相同的功能dbo.split。要获得输出(Agency 在一列中,代码在另一列中),您可以使用 substring 和 char 索引,这将帮助您分成两列。

我对您的脚本做了一些改动: 在截断字符串时将长度从 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 

它 运行 没有错误,正如 Ben 提到的那样,该功能就在这里。 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    

可能您需要这样的东西:-

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