【Sql】—存储过程中截取字符串

前言

    项目中需要将一个拼接好的字符串作为参数传入存储过程中,而在存储过程中需要将字符串拆开,下面来看一下实现过程。

正文

功能描述

    界面接收一系列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  

字符串小课堂

  • substring(expression,start,length)
    这里写图片描述
        应用
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

这里写图片描述
  备注
    charindex的索引也是从1 开始的。

总结

    感谢您的阅读,以上就是对于存储过程中字符串截取的一些介绍,希望对您有所帮助!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奔跑的大白啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值