解析列中的值并插入 T-Sql 中的新 table
Parse value from column and insert into new table in T-Sql
我有一列需要解析并插入到新的 table 中。我已经非常接近获得我需要的数据,但我似乎无法获得正确的语法。下面是我需要解析的数据格式:
装箱单 #195,UID = Pkg-15094-195
装箱单 #112,UID = Pkg-41251-241
我只需要装箱单号。当然,它并不总是 2 个字符。
好像比较简单,就是把[#]和[]这两个字符的index区别一下
然后从 [#] + 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 分配变量,我总是以相同的 "invalid column name" 错误结束。
DECLARE @length bigint = CHARINDEX(',', IMG_FILE_DESCRIPTION);
Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.
charindex可以发送的两种return类型是int还是bigint都是一样的
使用这个:
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.
如果您对 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
Returns
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)
我有一列需要解析并插入到新的 table 中。我已经非常接近获得我需要的数据,但我似乎无法获得正确的语法。下面是我需要解析的数据格式:
装箱单 #195,UID = Pkg-15094-195
装箱单 #112,UID = Pkg-41251-241
我只需要装箱单号。当然,它并不总是 2 个字符。
好像比较简单,就是把[#]和[]这两个字符的index区别一下 然后从 [#] + 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 分配变量,我总是以相同的 "invalid column name" 错误结束。
DECLARE @length bigint = CHARINDEX(',', IMG_FILE_DESCRIPTION);
Msg 207, Level 16, State 1, Line 3
Invalid column name 'IMG_FILE_DESCRIPTION'.
charindex可以发送的两种return类型是int还是bigint都是一样的
使用这个:
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.
如果您对 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
Returns
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)