求简单快捷SQL语句,分解字符串。
现一个字符串,格式如下:车位地址1,车态位状1|车位地址2,车位状态2|.....车位地址n,车位状态n
格式说明:
1.记录之间是用“|”号分隔
2.字段之间是用“,”号分隔
需要将其分解为一个临时表,表结构如下:
CREATE TABLE #Tmp
(
BerthCode VARCHAR(20) ,-- 车位地址
BerthStatus VARCHAR(20)-- 车位位状
)
CREATE TABLE test (id INT,[key] NVARCHAR(256))
INSERT INTO test
VALUES(1,'车位地址1,车态位状1
[解决办法]
车位地址2,车位状态2
[解决办法]
车位地址n,车位状态n')
;WITH cte AS (
SELECT distinct
SUBSTRING([key],number,CHARINDEX('
[解决办法]
',[key]+'
[解决办法]
',number)-number) as [key]
from
test a,master..spt_values
where
number >=1 and number<len([key])
and type='p'
and substring('
[解决办法]
'+[key],number,1)='
[解决办法]
')
SELECT SUBSTRING([key],1,CHARINDEX(',',[key],1)-1) AS BerthCode,SUBSTRING([key],CHARINDEX(',',[key],1)+1,LEN([key])) AS [BerthStatus]
FROM cte
/*
BerthCode BerthStatus
------------- -------------------
车位地址1 车态位状1
车位地址2 车位状态2
车位地址n 车位状态n
*/
declare @str varchar(200)
set @str='车位地址1,车态位状1
[解决办法]
车位地址2,车位状态2
[解决办法]
车位地址13,车位状态13
[解决办法]
车位地址n,车位状态n'
if OBJECT_ID('tmp',N'U')>0 drop table tb
create table tmp(BerthCode VARCHAR(20),BerthStatus VARCHAR(20))
set @str=LTRIM(RTRIM(@str))
if RIGHT(@str,1)<>'
[解决办法]
'
set @str=@str+'
[解决办法]
'
while CHARINDEX('
[解决办法]
',@str)>0
begin
insert into tmp(BerthCode,BerthStatus)
select SUBSTRING(@str,1,CHARINDEX(',',@str)-1),SUBSTRING(@str,CHARINDEX(',',@str)+1,CHARINDEX('
[解决办法]
',@str)-1-CHARINDEX(',',@str))
set @str=STUFF(@str,1,CHARINDEX('
[解决办法]
',@str),'')
end
select * from tmp
drop table tmp
--结果
BerthCode BerthStatus
-------------------- --------------------
车位地址1 车态位状1
车位地址2 车位状态2
车位地址13 车位状态13
车位地址n 车位状态n
(4 行受影响)