2017-06-02 44 views
0

我有一列需要解析并插入到新表中。我非常接近获取我需要的数据,但我似乎无法得到正确的语法。下面是数据的我需要解析的格式为:从列解析值并插入到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可以发送的两种返回类型,这是一样的。

回答

1

使用此:

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) 

运行代码here

+0

感谢您的快速回复。我糟糕地表达了我的查询,并没有显示我正在处理的全部列数据。我刚刚编辑了我的问题以反映我的数据。 不幸的是我不能使用替换,因为数据的末尾将总是有不同的数字。 –

+0

@BrianGe好的,我根据您添加的新信息更新了我的解决方案。检查一下,并使用链接尝试。 – TheEsnSiavashi

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,'[[',']]') 
*/ 
0

提取滑ID,

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


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