前言 |
项目中需要将一个拼接好的字符串作为参数传入存储过程中,而在存储过程中需要将字符串拆开,下面来看一下实现过程。
正文 |
界面接收一系列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
AS
BEGIN
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)
end
set @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
end
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
set @ReturnMessage = ERROR_MESSAGE()
RAISERROR(@ReturnMessage,16,1)--抛出异常
END CATCH
END
declare @subString nvarchar(64)
BEGIN TRAN
select @subString = substring('Hello,Kitty!',1,1); --H
print 1
print @subString
select @subString = substring('Hello,Kitty',2,3); --ell
print 2
print @subString
select @subString = substring('Hello,Kitty',-1,3); --H
print 3
print @subString
select @subString = substring('Hello,Kitty',-3,3); --null
print 4
print @subString
select @subString = substring('Hello,Kitty',0,3); --He
print 5
备注
存储过程中用到的substring 中的字符串索引是从1开始的,并且使用坐标索引,如果start的值为0或负数,则只返回那些所在位置大于零的字符;如果start的值大于字符串的长度,则返回NULL值。
当start的值为0或者负数时,截取长度为:length - |(start - 1)|
- CharIndex(expression1,expression2[,start_location])
应用
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
set @subString = charindex('N','Hello,Kitty',3); --0
print @subString
总结 |
感谢您的阅读,以上就是对于存储过程中字符串截取的一些介绍,希望对您有所帮助!