繁体   English   中英

从列中解析值并插入到T-Sql中的新表中

[英]Parse value from column and insert into new table in T-Sql

我有一列需要解析并插入到新表中。 我已经非常接近获取所需的数据,但是我似乎无法正确获取语法。 这是我需要解析的数据格式:

装箱单#195,UID = Pkg-15094-195

装箱单#112,UID = Pkg-41251-241

我只需要装箱单号。 当然,它不一定总是2个字符。

似乎比较简单,只需获取字符[#]和[,]的索引差,然后从[#] +1的索引开始,长度为[,]-[#]-1。这就是额外的减法那搞砸了我的语法:

SELECT substring(IMG_FILE_DESCRIPTION, 
    CHARINDEX('#', IMG_FILE_DESCRIPTION) + 1,
    CHARINDEX(',', IMG_FILE_DESCRIPTION) - CHARINDEX('#', IMG_FILE_DESCRIPTION)
)
AS PKL
FROM MASTER_SCAN_IMAGE
where IMG_SCT_PKEY = '21'

那行得通,但是给了我太多。 如果我尝试添加另一个类似的减法,则会出现语法错误:

SELECT substring(IMG_FILE_DESCRIPTION, 
    CHARINDEX('#', IMG_FILE_DESCRIPTION) + 1,
    (CHARINDEX(',', IMG_FILE_DESCRIPTION) - CHARINDEX('#', IMG_FILE_DESCRIPTION)) -1
)
AS PKL
FROM MASTER_SCAN_IMAGE
where IMG_SCT_PKEY = '21'

Msg 537, Level 16, State 2, Line 1 Invalid length parameter passed to the LEFT or SUBSTRING function.

因此,我认为我应该将长度值包装到一个变量中,但同时也会产生语法错误:

SELECT *
FROM MASTER_SCAN_IMAGE
DECLARE @length int = CHARINDEX(',', IMG_FILE_DESCRIPTION) - CHARINDEX('#', IMG_FILE_DESCRIPTION);

Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.
Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.

实际上,我似乎根本无法使用CHARINDEX来分配变量,我总是会遇到相同的“无效列名”错误。

DECLARE @length bigint = CHARINDEX(',', IMG_FILE_DESCRIPTION);

Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.

无论我使用int还是bigint都是相同的,这是charindex可以发送的两种返回类型。

用这个:

declare @column varchar(200) = 'Packing Slip #195, UID = Pkg-15094-195'


select RIGHT(LEFT(@column, CHARINDEX(',', @column)-1), CHARINDEX('#', REVERSE(LEFT(@column, CHARINDEX(',', @column)-1)))-1) 

这里运行代码。

如果您愿意接受TVF ...请考虑以下事项。

厌倦了提取字符串,我修改了一个解析函数以接受两个非相似的分隔符。

Declare @YourTable table (ID int,IMG_FILE_DESCRIPTION varchar(max))
Insert Into @YourTable values 
 (1,'Packing Slip #195, UID = Pkg-15094-195')
,(2,'Packing Slip #112, UID = Pkg-41251-241')
,(3,'Packing Slip #222, UID = Pkg-41251-241 and Slip #999')  -- Notice two Packing Slips

Select A.ID
      ,SlipNr = B.RetVal
 From  @YourTable A
 Cross Apply [dbo].[udf-Str-Extract](A.IMG_FILE_DESCRIPTION+',','Slip #',',') B

退货

ID  SlipNr
1   195
2   112
3   222    <-- Notice multiple slips
3   999    <-- Notice multiple slips

UDF(如果有兴趣)

CREATE FUNCTION [dbo].[udf-Str-Extract] (@String varchar(max),@Delimiter1 varchar(100),@Delimiter2 varchar(100))
Returns Table 
As
Return (  

with   cte1(N)   As (Select 1 From (Values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) N(N)),
       cte2(N)   As (Select Top (IsNull(DataLength(@String),0)) Row_Number() over (Order By (Select NULL)) From (Select N=1 From cte1 N1,cte1 N2,cte1 N3,cte1 N4,cte1 N5,cte1 N6) A ),
       cte3(N)   As (Select 1 Union All Select t.N+DataLength(@Delimiter1) From cte2 t Where Substring(@String,t.N,DataLength(@Delimiter1)) = @Delimiter1),
       cte4(N,L) As (Select S.N,IsNull(NullIf(CharIndex(@Delimiter1,@String,s.N),0)-S.N,8000) From cte3 S)

Select RetSeq = Row_Number() over (Order By N)
      ,RetPos = N
      ,RetVal = left(RetVal,charindex(@Delimiter2,RetVal)-1) 
 From  (
        Select *,RetVal = Substring(@String, N, L) 
         From  cte4
       ) A
 Where charindex(@Delimiter2,RetVal)>1

)
/*
Max Length of String 1MM characters

Declare @String varchar(max) = 'Dear [[FirstName]] [[LastName]], ...'
Select * From [dbo].[udf-Str-Extract] (@String,'[[',']]')
*/

提取单据ID,

   declare @column varchar(200) = 'Packing Slip #234234295, UID = Pkg-15094-195'


   select substring(@column,charindex('#',@column)+1,charindex(',',@column)-charindex('#',@column)-1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM