如何在sql server中解析数组

如何在sql server中解析数组,sql,tsql,sql-server-2014,Sql,Tsql,Sql Server 2014,我创建了一个如下所示的存储过程 CREATE PROCEDURE [EXP_RfPickAfter] ( @SESSIONVALUE xml, @WorkDSArray nvarchar(max), @UserSignonDS nvarchar(max), @Direction nvarchar(max), @ImmediateCount nvarchar(max), @CCWorkUnit nvarchar(max), @PartialP

我创建了一个如下所示的存储过程

CREATE PROCEDURE [EXP_RfPickAfter] (
    @SESSIONVALUE xml,
    @WorkDSArray nvarchar(max),
    @UserSignonDS nvarchar(max),
    @Direction nvarchar(max),
    @ImmediateCount nvarchar(max),
    @CCWorkUnit nvarchar(max),
    @PartialPick nvarchar(max),
    @RETURNVALUE nvarchar(max) output
       )
      AS 
        SET NOCOUNT ON;
@workDSArray has this long string in it 

924WORK0924841SEQUENCE8410841842EQUIPMENT_LOC842842843PARENT_LOGISTICS_    
UNIT843843844REFERENCE_TYPE844Order844845INVENTORY_AT_
PD845845846FROMVER846None846847INTERNAL_NUM8476851842847848START_
DATE_TIME848848849INCHKDIG849849850TOTAL_VOLUME8500850851
TO_LOC851SHIP-1851852INTERNAL_NUM_TYPE852Shipment852853
WEIGHT_UM853LB853854COMPANY854SHOS854855QUANTITY_UM855CS855856OUTGOING_
PD_LOC856856857WORK_TYPE857LPNPick857858END_DATE_TIME858858859
ACTUALFROMWHS859L455859860LOT860860861WORK_ZONE1861861862
TOCONTAINERID8621862863INVER863863864TRACK_CONTAINERS864N864865
TO_LOC_INV_ATTRIBUTES_ID865865866CYCLE_COUNT866866867
LAUNCH_NUM86716949391867868ACTUALTOLOC868-jisavm3868869
FROM_CHECK_DIG869869870FROM_WHS870L455870871
WORK_GROUP871Picking871872INTERNAL_LINE_NUM187232612518872873
VOLUME_UM873873874ACTUALFROMLOC874NF-1-F-28-1874875
INTERNAL_REQ_NUM87520774185875876TO_WHS876L455876877
INTERNAL_LINE_NUM87732612518877878TREE_UNIT87826385537878879
INWRKZONE879879880PUTLOC880SHIP-1880881CONTAINER_ID88116489660881882
INTERNAL_CONTAINER_NUM88226385537882883FROMTRKCONT883Y883884
PARENT_CONTAINER_NUM8840884885CONVERTED_QTY_UM885CS885886
ACTUALTOWHS886L455886887OUTWRKZONE887887888
VERIFICATION_METH888None888889USER_DEF4889 L455-RS 2889890
REFERENCE_ID890XKJNNLJN890891LOGISTICS_UNIT89116489660891892
MESSAGE_ID892892893PICKLOC893NF-1-F-28-1893894
CURRENTLOC894F894895TREE_UNIT_ID89516489660895897
TOCONTAINERID089716489660897898TOTAL_WEIGHT8981898899
TOTAL_VALUE8990899900TO_CHECK_DIG900900901OUTCHECKDIG901901902
TO_QTY9020902903INTRKCONT903903904FROM_LOC_INV_ATTRIBUTES_ID904904905
INTERNAL_INSTRUCTION_NUM90520699485905906ITEM_DESC906MSF21D4MDE -       
Refrigerator906907ITEM907SHOS-STOCK907908
COMPLETEDBYUSER908jisavm3908909
TRANSPORT_CONT_ID90916489660909910OUTTRKCONT910910911ACCOUNT911
Store #9449911912INCOMING_PD_LOC912912913INVENTORY_TRACKING913Y913914
LOCATION_CLASS914Shipping Dock914915FROM_QTY9151915916OUTVERMETH916916917
CONVERTED_QTY9171917918QUANTITY9181918919
PARENT_INSTR91920699484919920
FROM_LOC920NF-1-F-28-1920921WORK_ZONE921W- 
Returns921922WORK_UNIT92216489660922923QTY
CONFIRMED9231923924925WORK9251925
我试图从这个字符串中解析containerID及其值,并在存储过程中的select语句中使用它,但我不确定如何只解析containerID


任何帮助都将不胜感激。

正如@hogan在他的评论中所说的那样,您可以使用字符串运算符提取一些while和if-else语句

--我正在编辑我的答案

要检索容器ID,请使用如下存储过程:

create proc getid (@string varchar(max)) as

declare @containerIdIndex int = (select charindex('CONTAINER_ID',@string))

declare @internalContainerIndex int = (select(Charindex('INTERNAL_CONTAINER', @string)))

declare @range int = @internalContainerindex-@containerIdindex+12
declare @start int = @containerIdIndex+12  --12 is to pass the 'Container_ID'

declare @containerId varchar(max)
set @containerId = substring(@string,@start,@range)
print @containerId

这是我为了得到正确的身份证而做的,我必须触发其他的东西。这并不理想,因为我不知道字符串是否会改变。如果有人知道更好的方法,请发帖感谢@ymuribbi,你帮了我很多忙。我编辑了这个以显示我的完整解决方案,以防其他人遇到这个问题

 DECLARE @WorkDSArray nvarchar(max);

    SET @WorkDSArray= '924WORK0924841SEQUENCE8410841842EQUIPMENT_LOC842842843PARENT_LOGISTICS_UNIT843843844REFERENCE_TYPE844Order844845INVENTORY_AT_PD845845846FROMVER846None846847INTERNAL_NUM8476851842847848START_DATE_TIME848848849INCHKDIG849849850TOTAL_VOLUME8500850851TO_LOC851SHIP-1851852INTERNAL_NUM_TYPE852Shipment852853WEIGHT_UM853LB853854COMPANY854SHOS854855QUANTITY_UM855CS855856OUTGOING_PD_LOC856856857WORK_TYPE857LPN Pick857858END_DATE_TIME858858859ACTUALFROMWHS859L455859860LOT860860861WORK_ZONE1861861862TOCONTAINERID8621862863INVER863863864TRACK_CONTAINERS864N864865TO_LOC_INV_ATTRIBUTES_ID865865866CYCLE_COUNT866866867LAUNCH_NUM86716949391867868ACTUALTOLOC868-jisavm3868869FROM_CHECK_DIG869869870FROM_WHS870L455870871WORK_GROUP871Picking871872INTERNAL_LINE_NUM187232612518872873VOLUME_UM873873874ACTUALFROMLOC874NF-1-F-28-1874875INTERNAL_REQ_NUM87520774185875876TO_WHS876L455876877INTERNAL_LINE_NUM87732612518877878TREE_UNIT87826385537878879INWRKZONE879879880PUTLOC880SHIP-1880881CONTAINER_ID88116489660881882INTERNAL_CONTAINER_NUM88226385537882883FROMTRKCONT883Y883884PARENT_CONTAINER_NUM8840884885CONVERTED_QTY_UM885CS885886ACTUALTOWHS886L455886887OUTWRKZONE887887888VERIFICATION_METH888None888889USER_DEF4889 L455-RS 2889890REFERENCE_ID890XKJNNLJN890891LOGISTICS_UNIT89116489660891892MESSAGE_ID892892893PICKLOC893NF-1-F-28-1893894CURRENTLOC894F894895TREE_UNIT_ID89516489660895897TOCONTAINERID089716489660897898TOTAL_WEIGHT8981898899TOTAL_VALUE8990899900TO_CHECK_DIG900900901OUTCHECKDIG901901902TO_QTY9020902903INTRKCONT903903904FROM_LOC_INV_ATTRIBUTES_ID904904905INTERNAL_INSTRUCTION_NUM90520699485905906ITEM_DESC906MSF21D4MDE - Refrigerator906907ITEM907SHOS-STOCK907908COMPLETEDBYUSER908jisavm3908909TRANSPORT_CONT_ID90916489660909910OUTTRKCONT910910911ACCOUNT911Store #9449911912INCOMING_PD_LOC912912913INVENTORY_TRACKING913Y913914LOCATION_CLASS914Shipping Dock914915FROM_QTY9151915916OUTVERMETH916916917CONVERTED_QTY9171917918QUANTITY9181918919PARENT_INSTR91920699484919920FROM_LOC920NF-1-F-28-1920921WORK_ZONE921W-Returns921922WORK_UNIT92216489660922923QTYCONFIRMED9231923924925WORK9251925'
    DECLARE @ContainerID integer;

    SET @ContainerID = CHARINDEX('TREE_UNIT_ID', @WorkDSArray); 

    DECLARE @ID nvarchar(max); 

    SET @ID = SUBSTRING(@WorkDSArray, @ContainerID,300)

    SELECT @ID;

    DECLARE @ActualContainerID nvarchar(max); 

    SET @ActualContainerID = SUBSTRING(@ID, 54, 9)

    SET @ActualContainerID = REPLACE(@ActualContainerID, CHAR(31), '')

    DECLARE @User integer

    DECLARE @UserID nvarchar(max) 

    SET @User = CHARINDEX('COMPLETEDBYUSER', @WorkDSArray);

    SET @UserID = SUBSTRING(@WorkDSArray, @User,27)

    DECLARE @ActualUserID nvarchar(max); 

    SET @ActualUserID = SUBSTRING(@UserID, 20, 8)

    SET @ActualUserID = REPLACE(@ActualUserID, CHAR(31), '')

    DECLARE @Shipment nvarchar(max)
    SET @Shipment = (SELECT CASE WHEN SH.COMPANY = 'SHOS' THEN '' ELSE SH.SHIPMENT_ID + '|' + 
SH."ROUTE" + '|' + 
SH."STOP" + '|' + 
SH.COMPANY + '|' + 
LEFT(SH.CUSTOMER_NAME,25) + '|' +
LEFT(SH.SHIP_TO_ADDRESS1,25) + '|' +
CASE WHEN SH.SHIP_TO_ADDRESS2 <> '' THEN SH.SHIP_TO_ADDRESS2 + '|' 
ELSE '' END +
LEFT(SH.SHIP_TO_CITY,25) + '|' +
LEFT(SH.SHIP_TO_STATE,25) + '|' +
LEFT(SH.SHIP_TO_POSTAL_CODE,25) END
FROM SHIPMENT_HEADER SH
JOIN SHIPPING_CONTAINER SC
ON SC.INTERNAL_SHIPMENT_NUM = SH.INTERNAL_SHIPMENT_NUM
WHERE SC.CONTAINER_ID = @ActualContainerID)

     DECLARE @ShipmentID nvarchar(max)

   SET @ShipmentID = SUBSTRING(@Shipment,0,9)



      --select top 1  device_name from dbo.DOCUMENT_ROUTING where document_type = 'HJBT_REC' and user_name = @user

     INSERT INTO [jbh].[PRT_REQ_WRK] 
     ([REQ_REF_TYP], [REQ_REF_I], [PRT_DVC_NM], [REQ_TMPL_NM], [REQ_VAL], [PRT_STT], [PRT_PRS_TYP], [PRT_Q], [CRT_S], [CRT_UID], [CRT_PGM_C], [LST_UPD_S], [LST_UPD_UID], [LST_UPD_PGM_C]) 
     VALUES (
     @ShipmentID, --[REQ_REF_TYP]
     '123abc', --[REQ_REF_I]
     'LB01885', --[PRT_DVC_NM]
     'HJBT_Shipping_Label.lbl', --[REQ_TMPL_NM]
     @Shipment, --[REQ_VAL]
     0, --[PRT_STT]
     'LABEL', --[PRT_PRS_TYP]
      1, --[PRT_Q]
      CURRENT_TIMESTAMP, --[CRT_S]
      @ActualUserID, --[CRT_UID]
     'WMSPrintService', --[CRT_PGM_C]
      CURRENT_TIMESTAMP, --[LST_UPD_S]
     'JISAVM3', --[LST_UPD_UID]
     'WMSPrintService') --[LST_UPD_PGM_C] 
DECLARE@WorkDSArray nvarchar(最大值);
设置@WorkDSArray=“924工作0924841顺序8410841842设备位置842842843客户物流单元843843844参考类型844订单844845库存数量8445846非内部数量847685842847848开始日期时间848848849英寸IG84984985总体积8500850851至位置1852内部数量852装运类型853重量853854公司数量TY_UM855CS855856输出_PD_LOC856856857工作类型857LPN选择857858结束日期时间8588859实际从859455859860地块186860861工作区1861862集装箱编号8621862863 INVER863863864集装箱864N864865到LOC INV属性(ID865865866周期数866866867发射号8671693918678688实际位置868-JISAVM388869从WHS8558871工作组内部线路检查DIG869887获得7232612518872873卷-UM873873874实际从87874NF-1-F-28-1874875内部请求数量8752074185876到8776L45876877内部线-数量87732612518877878树-单元878263855378879在WRKZONE 879879880 Putloc880-1880881集装箱-ID88116489608812内部集装箱-编号88226385537882888883TRKContr883Y883888888QT父集装箱Y_um885cs8858886实际工作流程HS886L455886887外业区887887888验证方法非888889用户定义4889 L455-RS28898990参考号890xKJNNLJN890891物流单元891164899660891892信息号892892893PICKLOC893NF-1-F-28-1893894当前位置894F894895Tree单元号89516489660895897包含89716489660897898总重量8981898899总价值8990899900从位置INV49005INT中检查DIG9009090901OUTCCHECKDIG901902到QTY9020902903内部说明90520699485906项目说明906MSF21D4MDE-冰箱906907项目907SHOS-STOCK907908由用户填写908JISAVM3908909运输控制ID90916489660909910出口TRKCont910911账户存储9449911912进货位置12913库存跟踪Y913914位置装运从质量9151915916到质量916916917转换的质量9171917918到质量9181918919从质量919151915916到质量914915到质量919191918919从质量919191699484919920到质量9202NF-1-F-28-1920921工作区921W-返回921922工作单元92216489609223QTY确认9231923924925工作9251925'
声明@ContainerID整数;
设置@ContainerID=CHARINDEX('TREE\u UNIT\u ID',@WorkDSArray);
声明@ID nvarchar(最大值);
设置@ID=SUBSTRING(@WorkDSArray,@ContainerID,300)
选择@ID;
声明@ActualContainerID nvarchar(最大值);
设置@ActualContainerID=子字符串(@ID,54,9)
设置@ActualContainerID=REPLACE(@ActualContainerID,字符(31),“”)
声明@User整数
声明@UserID nvarchar(最大值)
设置@User=CHARINDEX('COMPLETEDBYUSER',@WorkDSArray);
设置@UserID=SUBSTRING(@WorkDSArray,@User,27)
声明@ActualUserID nvarchar(最大值);
设置@actualserid=SUBSTRING(@UserID,20,8)
设置@actualserid=REPLACE(@actualserid,CHAR(31),“”)
在装运时申报nvarchar(最大值)
设置@shipping=(当SH.COMPANY='SHOS'时选择CASE,然后选择'ELSE SH.shipping_ID+'|'+
SH.“路线”+“|”+
SH.“停止”+“|”+
SH.COMPANY+“|”+
左(SH.CUSTOMER_NAME,25)+'|'+
左(SH.SHIP_至_地址1,25)+'|'+
当SH.SHIP_至_地址2''时,则SH.SHIP_至_地址2+'|'
“否则”结束+
左(船到城市,25)+“船”+
左(SH.SHIP_至_状态,25)+'|'+
左(SH.发货至邮政编码,25)端
自装运日起
加入航运及货柜有限公司
在SC.INTERNAL\u shipping\u NUM=SH.INTERNAL\u shipping\u NUM上
其中SC.CONTAINER_ID=@ActualContainerID)
声明@ShipmentID nvarchar(最大值)
设置@ShipmentID=子字符串(@Shipping,0,9)
--从dbo.DOCUMENT\u路由中选择前1个设备名称,其中DOCUMENT\u type='HJBT\u REC'和user\u name=@user
插入[jbh]。[PRT\U REQ\U WRK]
([REQ_REF_TYP]、[REQ_REF_I]、[PRT_DVC_NM]、[REQ_TMPL_NM]、[REQ_VAL]、[PRT_STT]、[PRT_PRS]、[CRT_UID]、[CRT_PGM_C]、[LST_UPD_S]、[LST_UPD_UID]、[LST_UPD_PGM_C])
价值观(
@ShipmentID,--[请求参考类型]
“123abc”——[REQ_REF_I]
‘LB01885’,--[PRT_DVC_NM]
‘HJBT_Shipping_Label.lbl’,--[REQ_TMPL_NM]
@装运,--[要求值]
0,--[PRT_STT]
“标签”——[PRT_PRS_TYP]
1,--[PRT_Q]
当前时间戳,-[CRT\U S]
@ActualUserID,--[CRT\U UID]
“WMSPrintService”——[CRT\U PGM\U C]
当前时间戳,-[LST\U UPD\S]
“JISAVM3”——[LST\U UPD\U UID]
“WMSPrintService”)--[LST\U UPD\U PGM\U C]

提供您的选择声明我真诚希望这是将数据输入数据库过程的一部分,而数据库本身并不依赖于将每个数据点存储在NVARCHAR(MAX)中。但答案是,使用SUBSTRING()。确切的逻辑取决于字符串中数据的结构。我要做的是使用容器ID进行另一次选择,以获取我要插入数据库的数据。因此,如果我做了类似DECLARE@Document varchar(max)的操作,那么如果我做了类似DECLARE atContainerID varchar(64)的操作,则选择CHARINDEX('ContainerID',atContainerID);声明atID varchar(8)在实际ID开始的位置选择CHARINDEX('atCONTAINERID',16)?这并不提供问题的答案。要评论或要求作者澄清,请留下