Sql 儲存過程中擷取字串

2021-08-15 01:26:59 字數 4171 閱讀 9551

前言

專案中需要將乙個拼接好的字串作為引數傳入儲存過程中,而在儲存過程中需要將字串拆開,下面來看一下實現過程。

正文介面接收一系列pcb序列號,在儲存過程中將傳入的一系列序列號取出來一一關聯,也就是說將傳進來的一系列序列號分為一組,並且過站操作(記錄一下)。

alter procedure [dbo].[cp_pm_pcb_bind]

@lotids nvarchar(1000), --pcb編號

@orderid nvarchar(64),

@defid nvarchar(64),

@stepid nvarchar(64),

@stationid nvarchar(64),

@machineid nvarchar(64),

@userid nvarchar(64),

@ispcb

int,

@returnmessage nvarchar(1000) out

asbegin

begin try

begin tran

declare @split varchar(2) --分隔符

declare @count

int --統計,出現的次數

set @returnmessage= 'ok'

set @lotids = substring(@lotids,1,len(@lotids)-1)--去掉最後乙個,

set @lotids=ltrim(rtrim(@lotids)) --傳進來需要擷取的字串

set @split=','

set @count = len(@lotids)-len(replace(@lotids,@split,''))

if@ispcb = 0

and@count !=0

begin

declare @pcbid nvarchar(64) --多個pcb關聯組的pcb號

declare @baseid nvarchar(64) --底座/底殼條碼

declare @location

int --',' 分隔符第一次出現的位置

declare @start

int --起始字串索引

declare @seed

int

declare @length

int

declare @templotid nvarchar(64) --臨時存放@lotid

set @ispcb = 1 --預設已經關聯

set @pcbid = newid()

set @length =len(@lotids)

set @start=1

set @seed=len(@split)

set @location=charindex(@split,@lotids)

while

@location

<>0

begin

--每乙個pcb條碼

set @templotid=substring(@lotids,@start,@location-@start)

insert into [dbo].[mm_lots_pcb] (lotid,pcbid,createdby,createdon,attribute01,attribute02,attribute03,attribute04,attribute05,attribute06)

values (@templotid,@pcbid,@userid,getdate(),'','','','','','')

set @start=@location+@seed

set @location=charindex(@split,@lotids,@start)

endset @templotid=substring(@lotids,@start,@length)

insert into [dbo].[mm_lots_pcb] (lotid,pcbid,createdby,createdon,attribute01,attribute02,attribute03,attribute04,attribute05,attribute06)

values (@templotid,@pcbid,@userid,getdate(),'','','','','','')

--pcb拼板過站

exec [dbo].[cp_pm_wip_pcb] @templotid,@orderid,@defid,@stepid,@stationid,@ispcb,@userid,null,@returnmessage out

endcommit tran

end try

begin catch

rollback tran

set @returnmessage = error_message()

raiserror(@returnmessage,16,1)--丟擲異常

備註儲存過程中用到的substring 中的字串索引是從1開始的,並且使用座標索引,如果start的值為0或負數,則只返回那些所在位置大於零的字元;如果start的值大於字串的長度,則返回null值。

當start的值為0或者負數時,擷取長度為:length - |(start - 1)|

應用

declare @substring int

begin tran

set @substring = charindex('h','hello,kitty!',1);

--1 print @substring

set @substring = charindex('l','hello,kitty',2);

--3 print @substring

set @substring = charindex('k','hello,kitty',7);

--7 print @substring

--如果在expression2內找不到expression1,則charindex返回0

備註charindex的索引也是從1 開始的。

總結

sql 擷取字串

sql 擷取字串 a.擷取從字串左邊開始n個字元 declare s1 varchar 100 select s1 select left s1,4 顯示結果 http b.擷取從字串右邊開始n個字元 例如取字元www.163.com declare s1 varchar 100 select s1...

SQL擷取字串

substring 返回字元 binary text 或 image 抒發式的一全體。無關可與當函式一伏運用的無效 microsoft sql server 資料種型的更多疑息,請參睹資料種型。語法 substring expression start length 引數 expression 是字...

SQL擷取字串

substring 返回字元 binary text 或image 表示式的一部分。有關可與該函式一起使用的有效 microsoft sql server 資料型別的更多資訊,請參見資料型別。語法substring expression start length 引數expression 是字串 二...