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