SQLServer递归用法总结

最近在优化一个存储过程,存储执行太慢,且没有用递归写法,我负责改成递归形式
@SourceSSNDataInfo是一个表变量
第0阶,之前是这么写的

INSERT INTO @SourceSSNDataInfo
SELECT '00'           AS 'Level',--Level  
       ''             AS 'ParentSysSSN',--ParentSysSSN  
       ''             AS 'ParentActualSSN',--ParentActualSSN  
       ''             AS 'ParentHHPN',--ParentHHPN  
       ''             AS 'ParentCustPN',--ParentCustPN  
       --A.sysserialno AS 'SerialSSN', --SerialSSN  
       --CASE WHEN LEN(LTRIM(RTRIM(B.ProductID))) <> 0 THEN B.ProductID ELSE A.sysserialno END AS 'ActualSSN ', --ActualSSN   
       @strSSN        AS 'SerialSSN',--SerialSSN  
       A.sysserialno  AS 'ActualSSN ',--ActualSSN   
       CASE
         WHEN @virtualskuno = '' THEN A.skuno
         ELSE @virtualskuno
       END            AS 'HHPN',--HHPN  
       --A.custpartno AS 'CustPN', --CustPN  
       C.partname     AS 'CustPN',--CustPN  
       A.categoryname AS 'CategoryName'
FROM   mfsysproduct AS A (NOLOCK),
       mfsysprodlink AS B (NOLOCK),
       mmprodmaster AS C (NOLOCK)
WHERE  A.sysserialno = @_strActualSSN
       AND A.sysserialno = B.SysSerialNo
       AND A.skuno = C.partno

第1阶

INSERT INTO @SourceSSNDataInfo
      SELECT '01'                          AS 'Level',--Level  
             A.SerialSSN                   AS 'ParentSysSSN',--ParentSysSSN  
             A.ActualSSN                   AS 'ParentActualSSN',--ParentActualSSN  
             A.HHPN                        AS 'ParentHHPN',--ParentHHPN  
             A.CustPN                      AS 'ParentCustPN',--ParentCustPN  
             --B.cserialno AS 'SerialSSN', --SerialSSN  
             CASE
               WHEN B.cserialno = B.partno THEN A.SerialSSN
               WHEN B.cserialno = (SELECT Field2
                                   FROM   mfsysprodlink
                                   WHERE  Field2 = B.cserialno
                                          AND ProductID <> ''
                                          AND cserialno LIKE '11S%') THEN (SELECT ProductID
                                                                           FROM   mfsysprodlink
                                                                           WHERE  Field2 = B.cserialno)
               ELSE B.cserialno
             END,--if CSN=PN else GET Top Level SSN info.  
             --dbo.fn_GetSSNByInput(B.cserialno) AS 'ActualSSN ', --ActualSSN   
             CASE
               WHEN dbo.Fn_getssnbyinput(B.cserialno) = A.ActualSSN THEN B.cserialno
               ELSE dbo.Fn_getssnbyinput(B.cserialno)
             END                           AS 'ActualSSN ',--ActualSSN   
             Replace (B.partno, '-HH', '') AS 'HHPN',--HHPN  
             --B.custpartno AS 'CustPN', --CustPN  
             C.partname                    AS 'CustPN',--CustPN  
             B.categoryname                AS 'CategoryName'
      FROM   @SourceSSNDataInfo AS A,
             mfsyscserial AS B (NOLOCK),
             mmprodmaster AS C (NOLOCK)
      WHERE  A.ActualSSN = B.sysserialno
             AND A.[Level] = '00'
             AND B.categoryname NOT IN (SELECT Value
                                        FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ','))
             AND B.partno = C.partno

第2阶

 INSERT INTO @SourceSSNDataInfo
      SELECT '02'           AS 'Level',--Level  
             A.SerialSSN    AS 'ParentSysSSN',--ParentSysSSN  
             A.ActualSSN    AS 'ParentActualSSN',--ParentActualSSN  
             A.HHPN         AS 'ParentHHPN',--ParentHHPN  
             A.CustPN       AS 'ParentCustPN',--ParentCustPN  
             --B.cserialno AS 'SerialSSN', --SerialSSN  
             CASE
               WHEN B.cserialno = B.partno THEN A.SerialSSN
               WHEN B.cserialno = (SELECT Field2
                                   FROM   mfsysprodlink
                                   WHERE  Field2 = B.cserialno
                                          AND ProductID <> ''
                                          AND cserialno LIKE '11S%') THEN (SELECT ProductID
                                                                           FROM   mfsysprodlink
                                                                           WHERE  Field2 = B.cserialno)
               ELSE B.cserialno
             END,--if CSN=PN else GET Top Level SSN info.  
             --dbo.fn_GetSSNByInput(B.cserialno) AS 'ActualSSN ', --ActualSSN   
             CASE
               WHEN dbo.Fn_getssnbyinput(B.cserialno) = A.ActualSSN THEN B.cserialno
               ELSE dbo.Fn_getssnbyinput(B.cserialno)
             END            AS 'ActualSSN ',--ActualSSN   
             B.partno       AS 'HHPN',--HHPN  
             --B.custpartno AS 'CustPN', --CustPN  
             C.partname     AS 'CustPN',--CustPN  
             B.categoryname AS 'CategoryName'
      FROM   @SourceSSNDataInfo AS A,
             mfsyscserial AS B (NOLOCK),
             mmprodmaster AS C (NOLOCK)
      WHERE  A.ActualSSN = B.sysserialno
             AND A.[Level] = '01'
             AND B.categoryname NOT IN (SELECT Value
                                        FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ','))
             AND A.ActualSSN NOT IN (SELECT ActualSSN
                                     FROM   @SourceSSNDataInfo
                                     WHERE  [Level] = '00')
             AND B.partno = C.partno

第3阶

 INSERT INTO @SourceSSNDataInfo
      SELECT '03'           AS 'Level',--Level  
             A.SerialSSN    AS 'ParentSysSSN',--ParentSysSSN  
             A.ActualSSN    AS 'ParentActualSSN',--ParentActualSSN  
             A.HHPN         AS 'ParentHHPN',--ParentHHPN  
             A.CustPN       AS 'ParentCustPN',--ParentCustPN  
             --B.cserialno AS 'SerialSSN', --SerialSSN  
             CASE
               WHEN B.cserialno = B.partno THEN A.SerialSSN
               WHEN B.cserialno = (SELECT Field2
                                   FROM   mfsysprodlink
                                   WHERE  Field2 = B.cserialno
                                          AND ProductID <> ''
                                          AND cserialno LIKE '11S%') THEN (SELECT ProductID
                                                                           FROM   mfsysprodlink
                                                                           WHERE  Field2 = B.cserialno)
               ELSE B.cserialno
             END,--if CSN=PN else GET Top Level SSN info.  
             --dbo.fn_GetSSNByInput(B.cserialno) AS 'ActualSSN ', --ActualSSN   
             CASE
               WHEN dbo.Fn_getssnbyinput(B.cserialno) = A.ActualSSN THEN B.cserialno
               ELSE dbo.Fn_getssnbyinput(B.cserialno)
             END            AS 'ActualSSN ',--ActualSSN   
             B.partno       AS 'HHPN',--HHPN  
             --B.custpartno AS 'CustPN', --CustPN  
             C.partname     AS 'CustPN',--CustPN  
             B.categoryname AS 'CategoryName'
      FROM   @SourceSSNDataInfo AS A,
             mfsyscserial AS B (NOLOCK),
             mmprodmaster AS C (NOLOCK)
      WHERE  A.ActualSSN = B.sysserialno
             AND A.[Level] = '02'
             AND B.categoryname NOT IN (SELECT Value
                                        FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ','))
             AND A.ActualSSN NOT IN (SELECT ActualSSN
                                     FROM   @SourceSSNDataInfo
                                     WHERE  [Level] = '01')
             AND B.partno = C.partno

这里多插一句,之前整体是这么写的

DECLARE @strSSN VARCHAR(50) = 'SHTJ8GKY00GETSC' --SHTJ8GKY00GETSC   --FRT1011491G0C5H
--XML Node Level 1  
DECLARE @STR_DATA TABLE
  (
     INPUT_MATERIAL  VARCHAR(50),
     INPUT_SERIAL    VARCHAR(50),
     PLANT_CODE      VARCHAR(50),
     OPERATION       VARCHAR(50),
     [ORDER]         VARCHAR(50),
     PART_NUMBER     VARCHAR(50),
     SERIAL_NUMBER   VARCHAR(50),
     FEATURE_CODE    VARCHAR(50),
     MATERIAL_CLASS  VARCHAR(50),
     CHARACTERISTIC  VARCHAR(50),
     COMPONENT_TYPE  VARCHAR(50),
     WWN             VARCHAR(50),
     CUST_SERIAL     VARCHAR(50),
     ECB             VARCHAR(50),
     EQUIPMENT_NO    VARCHAR(50),
     MAC_ADDR        VARCHAR(50),
     SERVICE_TAG     VARCHAR(50),
     CUST_PART       VARCHAR(50),
     CUST_ECREV      VARCHAR(50),
     SYSTEM_SERIAL   VARCHAR(50),
     [ERROR_MESSAGE] VARCHAR(50),
     VENDOR_PART     VARCHAR(50),
     POSITION_REQD   VARCHAR(50),
     DETAIL          VARCHAR(50),
     REVISION        VARCHAR(50)
  )
--XML Node Level 2                
DECLARE @ZPE_ISTPCOMP TABLE
  (
     ZINDEX         INT IDENTITY(1, 1) NOT NULL,
     BM_LEVEL       VARCHAR(50),
     PART_NUMBER    VARCHAR(50),
     SERIAL_NUMBER  VARCHAR(50),
     FEATURE_CODE   VARCHAR(50),
     MATERIAL_CLASS VARCHAR(50),
     CHARACTERISTIC VARCHAR(50),
     COMPONENT_TYPE VARCHAR(50),
     WWN            VARCHAR(50),
     CUST_SERIAL    VARCHAR(50),
     PARENT_MATNR   VARCHAR(50),
     PARENT_SERNR   VARCHAR(50),
     ECB_C          VARCHAR(50),
     EQUIPMENT_NO   VARCHAR(50),
     MAC_ADDR_C     VARCHAR(50),
     SERVICE_TAG_C  VARCHAR(50),
     POSITION_TYPE  VARCHAR(50),
     POSITION_NO    VARCHAR(50),
     CUST_PART      VARCHAR(50),
     CUST_ECREV     VARCHAR(50),
     VENDOR_PART    VARCHAR(50),
     POSITION_REQD  VARCHAR(50),
     REVISION       VARCHAR(50)
  )
DECLARE @SourceSSNDataInfo TABLE
  (
     SeqNO           INT IDENTITY(1, 1) NOT NULL,
     [Level]         VARCHAR(50),
     ParentSysSSN    VARCHAR(50),
     ParentActualSSN VARCHAR(50),
     ParentHHPN      VARCHAR(50),
     ParentCustPN    VARCHAR(50),
     SerialSSN       VARCHAR(50),
     ActualSSN       VARCHAR(50),
     HHPN            VARCHAR(50),
     CustPN          VARCHAR(50),
     CategoryName    VARCHAR(50)
  )
DECLARE @level TABLE
  (
     ssn      VARCHAR(50),
     csn      VARCHAR(50),
     LevelNum INT
  )
DECLARE @xmlResult        XML,
        @xml_ForSend      VARCHAR(MAX),
        @ERROR_MSG        VARCHAR(100),--Error Message  
        @_strActualSSN    VARCHAR(50),
        @_strPartNO       VARCHAR(50),
        @_strNextEvent    VARCHAR(50),
        @_strRouteID      VARCHAR(50),
        @_strSPError      VARCHAR(100),
        @needChangeCustSn VARCHAR(800)

SET @ERROR_MSG = ''
SET @_strActualSSN = ''
SET @_strPartNO = ''
SET @_strNextEvent = ''
SET @_strRouteID = ''
SET @_strSPError = ''
SET @needChangeCustSn =''
  
  BEGIN
SELECT @_strActualSSN = dbo.Fn_getssnbyinput(@strSSN)

--Get PartNo by Actual SSN      
SELECT @_strPartNO = A.skuno,
       --@_strNextEvent = B.nextevent,  
       @_strNextEvent = dbo.Fn_changesfcstation(A.skuno, B.nextevent),
       @_strRouteID = B.routeid
FROM   mfsysproduct AS A (NOLOCK),
       mfworkstatus AS B (NOLOCK)
WHERE  A.sysserialno = B.sysserialno
       AND A.sysserialno = @_strActualSSN

DECLARE @woEcb VARCHAR(100) = ''
DECLARE @virtualskuno VARCHAR(100)=''

--*******************************************************Top Level SSN  
INSERT INTO @SourceSSNDataInfo
SELECT 'TOP'          AS 'Level',--Level  
       ''             AS 'ParentSysSSN',--ParentSysSSN  
       ''             AS 'ParentActualSSN',--ParentActualSSN  
       ''             AS 'ParentHHPN',--ParentHHPN  
       ''             AS 'ParentCustPN',--ParentCustPN  
       --A.sysserialno AS 'SerialSSN', --SerialSSN  
       --CASE WHEN LEN(LTRIM(RTRIM(B.ProductID))) <> 0 THEN B.ProductID ELSE A.sysserialno END AS 'ActualSSN ', --ActualSSN   
       @strSSN        AS 'SerialSSN',--SerialSSN  
       A.sysserialno  AS 'ActualSSN ',--ActualSSN   
       CASE
         WHEN @virtualskuno = '' THEN A.skuno
         ELSE @virtualskuno
       END            AS 'HHPN',--HHPN  
       --A.custpartno AS 'CustPN', --CustPN  
       C.partname     AS 'CustPN',--CustPN  
       A.categoryname AS 'CategoryName'
FROM   mfsysproduct AS A (NOLOCK),
       mfsysprodlink AS B (NOLOCK),
       mmprodmaster AS C (NOLOCK)
WHERE  A.sysserialno = @_strActualSSN
       AND A.sysserialno = B.SysSerialNo
       AND A.skuno = C.partno

INSERT INTO @STR_DATA
            (INPUT_MATERIAL,
             INPUT_SERIAL,
             PLANT_CODE,
             OPERATION,
             [ORDER],
             PART_NUMBER,
             SERIAL_NUMBER,
             FEATURE_CODE,
             MATERIAL_CLASS,
             CHARACTERISTIC,
             COMPONENT_TYPE,
             WWN,
             CUST_SERIAL,
             ECB,
             EQUIPMENT_NO,
             MAC_ADDR,
             SERVICE_TAG,
             CUST_PART,
             CUST_ECREV,
             SYSTEM_SERIAL,
             [ERROR_MESSAGE],
             VENDOR_PART,
             POSITION_REQD,
             REVISION)
SELECT ''                                                                  AS 'INPUT_MATERIAL',
       B.SerialSSN                                                         AS 'INPUT_SERIAL',
       Ltrim(Rtrim(A.factoryid))                                           AS 'PLANT_CODE',
       --A.nextevent AS 'OPERATION',  
       @_strNextEvent                                                      AS 'OPERATION',
       A.workorderno                                                       AS 'ORDER',
       B.HHPN                                                              AS 'PART_NUMBER',
       B.SerialSSN                                                         AS 'SERIAL_NUMBER',
       (SELECT FEATURE_CODE
        FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                     AS 'FEATURE_CODE',
       (SELECT MATERIAL_CLASS
        FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                     AS 'MATERIAL_CLASS',
       (SELECT CHARACTERISTIC
        FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                     AS 'CHARACTERISTIC',
       (SELECT COMPONENT_TYPE
        FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                     AS 'COMPONENT_TYPE',
       (SELECT WWN
        FROM   dbo.Fn_getxmlnodemaininfobyssn('', B.SerialSSN, 'TOP', '')) AS 'WWN',
       (SELECT CUST_SERIAL
        FROM   dbo.Fn_getxmlnodemaininfobyssn('', CASE
                                                    WHEN @needChangeCustSn <> 'TRUE' THEN B.SerialSSN
                                                    ELSE (SELECT Isnull(ProductID, '')
                                                          FROM   mfsysprodlink
                                                          WHERE  SysSerialNo = B.SerialSSN)
                                                  END, 'TOP', ''))         AS 'CUST_SERIAL',
       CASE
         WHEN @woEcb <> '' THEN @woEcb
         ELSE (SELECT ECB
               FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))
       END                                                                 AS 'ECB',
       (SELECT EQUIPMENT_NO
        FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                     AS 'EQUIPMENT_NO',
       (SELECT MAC_ADDR
        FROM   dbo.Fn_getxmlnodemaininfobyssn('', B.SerialSSN, 'TOP', '')) AS 'MAC_ADDR',
       (SELECT SERVICE_TAG
        FROM   dbo.Fn_getxmlnodemaininfobyssn('', B.SerialSSN, 'TOP', '')) AS 'SERVICE_TAG',
       --B.CustPN AS 'CUST_PART',               
       CASE
         WHEN B.CustPN = B.HHPN THEN ''
         WHEN @needChangeCustSn = 'TRUE' THEN (SELECT M2.custpartno-- GET SUB LEVEL CUSTPARTNO   
                                               FROM   mfsysprodlink M1,
                                                      mfsysproduct M2
                                               WHERE  M1.ProductID = M2.sysserialno
                                                      AND M1.SysSerialNo = B.SerialSSN)
         ELSE B.CustPN
       END                                                                 AS 'CUST_PART',
       ''                                                                  AS 'CUST_ECREV',
       ''                                                                  AS 'SYSTEM_SERIAL',
       @ERROR_MSG                                                          AS 'ERROR_MESSAGE',
       --LTRIM(RTRIM(C.manufacturerpn)) AS 'VENDOR_PART',  
       CASE
         WHEN Ltrim(Rtrim(C.manufacturerpn)) = B.HHPN THEN ''
         ELSE Ltrim(Rtrim(C.manufacturerpn))
       END                                                                 AS 'VENDOR_PART',
       ''                                                                  AS 'POSITION_REQD',
       ''                                                                  AS 'REVISION'
FROM   mfworkstatus AS A (NOLOCK)
       RIGHT JOIN @SourceSSNDataInfo AS B
               ON A.sysserialno = B.ActualSSN
       INNER JOIN mmprodmaster AS C (NOLOCK)
               ON B.HHPN = C.partno

IF @@ERROR <> 0
  BEGIN
      SET @_strSPError = 'Insert Top Level Data Error.'

      RAISERROR (@_strSPError,16,1)
  END

--*******************************************************Level 00 SSN  
INSERT INTO @SourceSSNDataInfo
SELECT '00'           AS 'Level',--Level  
       ''             AS 'ParentSysSSN',--ParentSysSSN  
       ''             AS 'ParentActualSSN',--ParentActualSSN  
       ''             AS 'ParentHHPN',--ParentHHPN  
       ''             AS 'ParentCustPN',--ParentCustPN  
       --A.sysserialno AS 'SerialSSN', --SerialSSN  
       --CASE WHEN LEN(LTRIM(RTRIM(B.ProductID))) <> 0 THEN B.ProductID ELSE A.sysserialno END AS 'ActualSSN ', --ActualSSN   
       @strSSN        AS 'SerialSSN',--SerialSSN  
       A.sysserialno  AS 'ActualSSN ',--ActualSSN   
       CASE
         WHEN @virtualskuno = '' THEN A.skuno
         ELSE @virtualskuno
       END            AS 'HHPN',--HHPN  
       --A.custpartno AS 'CustPN', --CustPN  
       C.partname     AS 'CustPN',--CustPN  
       A.categoryname AS 'CategoryName'
FROM   mfsysproduct AS A (NOLOCK),
       mfsysprodlink AS B (NOLOCK),
       mmprodmaster AS C (NOLOCK)
WHERE  A.sysserialno = @_strActualSSN
       AND A.sysserialno = B.SysSerialNo
       AND A.skuno = C.partno

--Insert Level 00 Info  
IF EXISTS (SELECT 0
           FROM   @SourceSSNDataInfo
           WHERE  [Level] = '00')
  BEGIN
      INSERT INTO @ZPE_ISTPCOMP
      SELECT '00'                                                               AS 'BM_LEVEL',
             B.HHPN                                                             AS 'PART_NUMBER',
             B.SerialSSN                                                        AS 'SERIAL_NUMBER',
             (SELECT FEATURE_CODE
              FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                    AS 'FEATURE_CODE',
             (SELECT MATERIAL_CLASS
              FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                    AS 'MATERIAL_CLASS',
             (SELECT CHARACTERISTIC
              FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                    AS 'CHARACTERISTIC',
             (SELECT COMPONENT_TYPE
              FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                    AS 'COMPONENT_TYPE',
             (SELECT WWN
              FROM   dbo.Fn_getxmlnodemaininfobyssn('', B.SerialSSN, '00', '')) AS 'WWN',
             (SELECT CUST_SERIAL
              FROM   dbo.Fn_getxmlnodemaininfobyssn('', CASE
                                                          WHEN @needChangeCustSn <> 'TRUE' THEN B.SerialSSN
                                                          ELSE (SELECT Isnull(ProductID, '')
                                                                FROM   mfsysprodlink
                                                                WHERE  SysSerialNo = B.SerialSSN)
                                                        END, 'TOP', ''))        AS 'CUST_SERIAL',
             ''                                                                 AS 'PARENT_MATNR',
             ''                                                                 AS 'PARENT_SERNR',
             (SELECT ECB
              FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                    AS 'ECB_C',
             (SELECT EQUIPMENT_NO
              FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                    AS 'EQUIPMENT_NO',
             (SELECT MAC_ADDR
              FROM   dbo.Fn_getxmlnodemaininfobyssn('', B.SerialSSN, '00', '')) AS 'MAC_ADDR_C',
             (SELECT SERVICE_TAG
              FROM   dbo.Fn_getxmlnodemaininfobyssn('', B.SerialSSN, '00', '')) AS 'SERVICE_TAG_C',
             ''                                                                 AS 'POSITION_TYPE',
             ''                                                                 AS 'POSITION_NO',
             --B.CustPN AS 'CUST_PART',  
             CASE
               WHEN B.CustPN = B.HHPN THEN ''
               WHEN @needChangeCustSn = 'TRUE' THEN (SELECT M2.custpartno-- GET SUB LEVEL CUSTPARTNO   
                                                     FROM   mfsysprodlink M1,
                                                            mfsysproduct M2
                                                     WHERE  M1.ProductID = M2.sysserialno
                                                            AND M1.SysSerialNo = B.SerialSSN)
               ELSE B.CustPN
             END                                                                AS 'CUST_PART',
             ''                                                                 AS 'CUST_ECREV',
             --LTRIM(RTRIM(C.manufacturerpn)) AS 'VENDOR_PART',  
             CASE
               WHEN Ltrim(Rtrim(C.manufacturerpn)) = B.HHPN THEN ''
               ELSE Ltrim(Rtrim(C.manufacturerpn))
             END                                                                AS 'VENDOR_PART',
             ''                                                                 AS 'POSITION_REQD',
             ''                                                                 AS 'REVISION'
      FROM   mfworkstatus AS A (NOLOCK)
             RIGHT JOIN @SourceSSNDataInfo AS B
                     ON A.sysserialno = B.ActualSSN
                        AND B.[Level] = '00'
             INNER JOIN mmprodmaster AS C (NOLOCK)
                     ON B.[Level] = '00'
                        AND B.HHPN = C.partno

      IF @@ERROR <> 0
        BEGIN
            SET @_strSPError = 'Insert Level 00 Data Error.'

            RAISERROR (@_strSPError,16,1)
        END
  END

--*******************************************************Level 01 SSN  
IF EXISTS (SELECT 0
           FROM   @SourceSSNDataInfo
           WHERE  [Level] = '00')
  BEGIN
      INSERT INTO @SourceSSNDataInfo
      SELECT '01'                          AS 'Level',--Level  
             A.SerialSSN                   AS 'ParentSysSSN',--ParentSysSSN  
             A.ActualSSN                   AS 'ParentActualSSN',--ParentActualSSN  
             A.HHPN                        AS 'ParentHHPN',--ParentHHPN  
             A.CustPN                      AS 'ParentCustPN',--ParentCustPN  
             --B.cserialno AS 'SerialSSN', --SerialSSN  
             CASE
               WHEN B.cserialno = B.partno THEN A.SerialSSN
               WHEN B.cserialno = (SELECT Field2
                                   FROM   mfsysprodlink
                                   WHERE  Field2 = B.cserialno
                                          AND ProductID <> ''
                                          AND cserialno LIKE '11S%') THEN (SELECT ProductID
                                                                           FROM   mfsysprodlink
                                                                           WHERE  Field2 = B.cserialno)
               ELSE B.cserialno
             END,--if CSN=PN else GET Top Level SSN info.  
             --dbo.fn_GetSSNByInput(B.cserialno) AS 'ActualSSN ', --ActualSSN   
             CASE
               WHEN dbo.Fn_getssnbyinput(B.cserialno) = A.ActualSSN THEN B.cserialno
               ELSE dbo.Fn_getssnbyinput(B.cserialno)
             END                           AS 'ActualSSN ',--ActualSSN   
             Replace (B.partno, '-HH', '') AS 'HHPN',--HHPN  
             --B.custpartno AS 'CustPN', --CustPN  
             C.partname                    AS 'CustPN',--CustPN  
             B.categoryname                AS 'CategoryName'
      FROM   @SourceSSNDataInfo AS A,
             mfsyscserial AS B (NOLOCK),
             mmprodmaster AS C (NOLOCK)
      WHERE  A.ActualSSN = B.sysserialno
             AND A.[Level] = '00'
             AND B.categoryname NOT IN (SELECT Value
                                        FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ','))
             AND B.partno = C.partno

      IF EXISTS (SELECT 0
                 FROM   @SourceSSNDataInfo
                 WHERE  [Level] = '01')
        BEGIN
            INSERT INTO @ZPE_ISTPCOMP
            SELECT '01'                                                                                          AS 'BM_LEVEL',
                   B.HHPN                                                                                        AS 'PART_NUMBER',
                   --B.SerialSSN AS 'SERIAL_NUMBER',  
                   --For DDIC&DELL Special Rule     
                   CASE
                     WHEN Len(Ltrim(Rtrim(B.SerialSSN))) > 15
                          AND B.CategoryName IN (SELECT Value
                                                 FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-DDIC-SPECIAL-MG', 'MG12L,MG01'), ',')) THEN LEFT(B.SerialSSN, 8)
                                                                                                                                                 + Substring(B.SerialSSN, 14, 20)
                     ELSE B.SerialSSN
                   END                                                                                           AS 'SERIAL_NUMBER',
                   (SELECT FEATURE_CODE
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'FEATURE_CODE',
                   (SELECT MATERIAL_CLASS
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'MATERIAL_CLASS',
                   (SELECT CHARACTERISTIC
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'CHARACTERISTIC',
                   (SELECT COMPONENT_TYPE
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'COMPONENT_TYPE',
                   (SELECT WWN
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '01', B.CategoryName)) AS 'WWN',
                   ( CASE
                       WHEN ( EXISTS (SELECT 1
                                      FROM   mfsyscserial E,
                                             mfsysprodlink F
                                      WHERE  E.cserialno = F.Field2
                                             AND F.ProductID = B.SerialSSN) ) THEN (SELECT field2
                                                                                    FROM   mfsysprodlink
                                                                                    WHERE  ProductID = B.SerialSSN)
                       ELSE (SELECT CUST_SERIAL
                             FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '01', B.CategoryName))
                     END )                                                                                       AS 'CUST_SERIAL',
                   B.ParentHHPN                                                                                  AS 'PARENT_MATNR',
                   B.ParentSysSSN                                                                                AS 'PARENT_SERNR',
                   (SELECT ECB
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'ECB_C',
                   (SELECT EQUIPMENT_NO
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'EQUIPMENT_NO',
                   (SELECT MAC_ADDR
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '01', B.CategoryName)) AS 'MAC_ADDR_C',
                   (SELECT SERVICE_TAG
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '01', B.CategoryName)) AS 'SERVICE_TAG_C',
                   ''                                                                                            AS 'POSITION_TYPE',
                   ''                                                                                            AS 'POSITION_NO',
                   --B.CustPN AS 'CUST_PART',  
                   CASE
                     WHEN B.CustPN = B.HHPN THEN ''
                     ELSE B.CustPN
                   END                                                                                           AS 'CUST_PART',
                   ''                                                                                            AS 'CUST_ECREV',
                   --LTRIM(RTRIM(C.manufacturerpn)) AS 'VENDOR_PART',  
                   CASE
                     WHEN Ltrim(Rtrim(C.manufacturerpn)) = B.HHPN THEN ''
                     ELSE Ltrim(Rtrim(C.manufacturerpn))
                   END                                                                                           AS 'VENDOR_PART',
                   ''                                                                                            AS 'POSITION_REQD',
                   ''                                                                                            AS 'REVISION'
            FROM   mfworkstatus AS A (NOLOCK)
                   RIGHT JOIN @SourceSSNDataInfo AS B
                           ON A.sysserialno = B.ActualSSN
                              AND B.[Level] = '01'
                   INNER JOIN mmprodmaster AS C (NOLOCK)
                           ON B.[Level] = '01'
                              AND B.HHPN = C.partno

            IF @@ERROR <> 0
              BEGIN
                  SET @_strSPError = 'Insert Level 01 Data Error.'

                  RAISERROR (@_strSPError,16,1)
              END
        END
  END

--*******************************************************Level 02 SSN  
IF EXISTS (SELECT 0
           FROM   @SourceSSNDataInfo
           WHERE  [Level] = '01')
  BEGIN
      --PRINT '02'  
      INSERT INTO @SourceSSNDataInfo
      SELECT '02'           AS 'Level',--Level  
             A.SerialSSN    AS 'ParentSysSSN',--ParentSysSSN  
             A.ActualSSN    AS 'ParentActualSSN',--ParentActualSSN  
             A.HHPN         AS 'ParentHHPN',--ParentHHPN  
             A.CustPN       AS 'ParentCustPN',--ParentCustPN  
             --B.cserialno AS 'SerialSSN', --SerialSSN  
             CASE
               WHEN B.cserialno = B.partno THEN A.SerialSSN
               WHEN B.cserialno = (SELECT Field2
                                   FROM   mfsysprodlink
                                   WHERE  Field2 = B.cserialno
                                          AND ProductID <> ''
                                          AND cserialno LIKE '11S%') THEN (SELECT ProductID
                                                                           FROM   mfsysprodlink
                                                                           WHERE  Field2 = B.cserialno)
               ELSE B.cserialno
             END,--if CSN=PN else GET Top Level SSN info.  
             --dbo.fn_GetSSNByInput(B.cserialno) AS 'ActualSSN ', --ActualSSN   
             CASE
               WHEN dbo.Fn_getssnbyinput(B.cserialno) = A.ActualSSN THEN B.cserialno
               ELSE dbo.Fn_getssnbyinput(B.cserialno)
             END            AS 'ActualSSN ',--ActualSSN   
             B.partno       AS 'HHPN',--HHPN  
             --B.custpartno AS 'CustPN', --CustPN  
             C.partname     AS 'CustPN',--CustPN  
             B.categoryname AS 'CategoryName'
      FROM   @SourceSSNDataInfo AS A,
             mfsyscserial AS B (NOLOCK),
             mmprodmaster AS C (NOLOCK)
      WHERE  A.ActualSSN = B.sysserialno
             AND A.[Level] = '01'
             AND B.categoryname NOT IN (SELECT Value
                                        FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ','))
             AND A.ActualSSN NOT IN (SELECT ActualSSN
                                     FROM   @SourceSSNDataInfo
                                     WHERE  [Level] = '00')
             AND B.partno = C.partno

      --Insert Level 02 info  
      IF EXISTS (SELECT 0
                 FROM   @SourceSSNDataInfo
                 WHERE  [Level] = '02')
        BEGIN
            INSERT INTO @ZPE_ISTPCOMP
            SELECT '02'                                                                                          AS 'BM_LEVEL',
                   B.HHPN                                                                                        AS 'PART_NUMBER',
                   --B.SerialSSN AS 'SERIAL_NUMBER',  
                   --For DDIC&DELL Special Rule     
                   CASE
                     WHEN Len(Ltrim(Rtrim(B.SerialSSN))) > 15
                          AND B.CategoryName IN (SELECT Value
                                                 FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-DDIC-SPECIAL-MG', 'MG12L,MG01'), ',')) THEN LEFT(B.SerialSSN, 8)
                                                                                                                                                 + Substring(B.SerialSSN, 14, 20)
                     ELSE B.SerialSSN
                   END                                                                                           AS 'SERIAL_NUMBER',
                   (SELECT FEATURE_CODE
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'FEATURE_CODE',
                   (SELECT MATERIAL_CLASS
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'MATERIAL_CLASS',
                   (SELECT CHARACTERISTIC
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'CHARACTERISTIC',
                   (SELECT COMPONENT_TYPE
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'COMPONENT_TYPE',
                   (SELECT WWN
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '02', B.CategoryName)) AS 'WWN',
                   ( CASE
                       WHEN ( EXISTS (SELECT 1
                                      FROM   mfsyscserial E,
                                             mfsysprodlink F
                                      WHERE  E.cserialno = F.Field2
                                             AND F.ProductID = B.SerialSSN) ) THEN (SELECT field2
                                                                                    FROM   mfsysprodlink
                                                                                    WHERE  ProductID = B.SerialSSN)
                       ELSE (SELECT CUST_SERIAL
                             FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '02', B.CategoryName))
                     END )                                                                                       AS 'CUST_SERIAL',
                   B.ParentHHPN                                                                                  AS 'PARENT_MATNR',
                   B.ParentSysSSN                                                                                AS 'PARENT_SERNR',
                   (SELECT ECB
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'ECB_C',
                   (SELECT EQUIPMENT_NO
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'EQUIPMENT_NO',
                   (SELECT MAC_ADDR
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '02', B.CategoryName)) AS 'MAC_ADDR_C',
                   (SELECT SERVICE_TAG
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '02', B.CategoryName)) AS 'SERVICE_TAG_C',
                   ''                                                                                            AS 'POSITION_TYPE',
                   ''                                                                                            AS 'POSITION_NO',
                   --B.CustPN AS 'CUST_PART',  
                   CASE
                     WHEN B.CustPN = B.HHPN THEN ''
                     ELSE B.CustPN
                   END                                                                                           AS 'CUST_PART',
                   ''                                                                                            AS 'CUST_ECREV',
                   --LTRIM(RTRIM(C.manufacturerpn)) AS 'VENDOR_PART',  
                   CASE
                     WHEN Ltrim(Rtrim(C.manufacturerpn)) = B.HHPN THEN ''
                     ELSE Ltrim(Rtrim(C.manufacturerpn))
                   END                                                                                           AS 'VENDOR_PART',
                   ''                                                                                            AS 'POSITION_REQD',
                   ''                                                                                            AS 'REVISION'
            FROM   mfworkstatus AS A (NOLOCK)
                   RIGHT JOIN @SourceSSNDataInfo AS B
                           ON A.sysserialno = B.ActualSSN
                              AND B.[Level] = '02'
                   INNER JOIN mmprodmaster AS C (NOLOCK)
                           ON B.[Level] = '02'
                              AND B.HHPN = C.partno

            IF @@ERROR <> 0
              BEGIN
                  SET @_strSPError = 'Insert Level 02 Data Error.'

                  RAISERROR (@_strSPError,16,1)
              END
        END
  END

--*******************************************************Level 03 SSN  
IF EXISTS (SELECT 0
           FROM   @SourceSSNDataInfo
           WHERE  [Level] = '02')
  BEGIN
      --PRINT '03'  
      INSERT INTO @SourceSSNDataInfo
      SELECT '03'           AS 'Level',--Level  
             A.SerialSSN    AS 'ParentSysSSN',--ParentSysSSN  
             A.ActualSSN    AS 'ParentActualSSN',--ParentActualSSN  
             A.HHPN         AS 'ParentHHPN',--ParentHHPN  
             A.CustPN       AS 'ParentCustPN',--ParentCustPN  
             --B.cserialno AS 'SerialSSN', --SerialSSN  
             CASE
               WHEN B.cserialno = B.partno THEN A.SerialSSN
               WHEN B.cserialno = (SELECT Field2
                                   FROM   mfsysprodlink
                                   WHERE  Field2 = B.cserialno
                                          AND ProductID <> ''
                                          AND cserialno LIKE '11S%') THEN (SELECT ProductID
                                                                           FROM   mfsysprodlink
                                                                           WHERE  Field2 = B.cserialno)
               ELSE B.cserialno
             END,--if CSN=PN else GET Top Level SSN info.  
             --dbo.fn_GetSSNByInput(B.cserialno) AS 'ActualSSN ', --ActualSSN   
             CASE
               WHEN dbo.Fn_getssnbyinput(B.cserialno) = A.ActualSSN THEN B.cserialno
               ELSE dbo.Fn_getssnbyinput(B.cserialno)
             END            AS 'ActualSSN ',--ActualSSN   
             B.partno       AS 'HHPN',--HHPN  
             --B.custpartno AS 'CustPN', --CustPN  
             C.partname     AS 'CustPN',--CustPN  
             B.categoryname AS 'CategoryName'
      FROM   @SourceSSNDataInfo AS A,
             mfsyscserial AS B (NOLOCK),
             mmprodmaster AS C (NOLOCK)
      WHERE  A.ActualSSN = B.sysserialno
             AND A.[Level] = '02'
             AND B.categoryname NOT IN (SELECT Value
                                        FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ','))
             AND A.ActualSSN NOT IN (SELECT ActualSSN
                                     FROM   @SourceSSNDataInfo
                                     WHERE  [Level] = '01')
             AND B.partno = C.partno

      --Insert Level 03 info  
     
	 select * from @SourceSSNDataInfo

      IF EXISTS (SELECT 0
                 FROM   @SourceSSNDataInfo
                 WHERE  [Level] = '03')
        BEGIN
            INSERT INTO @ZPE_ISTPCOMP
            SELECT '03'                                                                                          AS 'BM_LEVEL',
                   B.HHPN                                                                                        AS 'PART_NUMBER',
                   --B.SerialSSN AS 'SERIAL_NUMBER',  
                   --For DDIC&DELL Special Rule     
                   CASE
                     WHEN Len(Ltrim(Rtrim(B.SerialSSN))) > 15
                          AND B.CategoryName IN (SELECT Value
                                                 FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-DDIC-SPECIAL-MG', 'MG12L,MG01'), ',')) THEN LEFT(B.SerialSSN, 8)
                                                                                                                                                 + Substring(B.SerialSSN, 14, 20)
                     ELSE B.SerialSSN
                   END                                                                                           AS 'SERIAL_NUMBER',
                   (SELECT FEATURE_CODE
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'FEATURE_CODE',
                   (SELECT MATERIAL_CLASS
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'MATERIAL_CLASS',
                   (SELECT CHARACTERISTIC
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'CHARACTERISTIC',
                   (SELECT COMPONENT_TYPE
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'COMPONENT_TYPE',
                   (SELECT WWN
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '03', B.CategoryName)) AS 'WWN',
                   ( CASE
                       WHEN ( EXISTS (SELECT 1
                                      FROM   mfsyscserial E,
                                             mfsysprodlink F
                                      WHERE  E.cserialno = F.Field2
                                             AND F.ProductID = B.SerialSSN) ) THEN (SELECT field2
                                                                                    FROM   mfsysprodlink
                                                                                    WHERE  ProductID = B.SerialSSN)
                       ELSE (SELECT CUST_SERIAL
                             FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '03', B.CategoryName))
                     END )                                                                                       AS 'CUST_SERIAL',
                   B.ParentHHPN                                                                                  AS 'PARENT_MATNR',
                   B.ParentSysSSN                                                                                AS 'PARENT_SERNR',
                   (SELECT ECB
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'ECB_C',
                   (SELECT EQUIPMENT_NO
                    FROM   dbo.Fn_getxmlnodeotherinfobypn(B.HHPN))                                               AS 'EQUIPMENT_NO',
                   (SELECT MAC_ADDR
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '03', B.CategoryName)) AS 'MAC_ADDR_C',
                   (SELECT SERVICE_TAG
                    FROM   dbo.Fn_getxmlnodemaininfobyssn(B.ParentActualSSN, B.SerialSSN, '03', B.CategoryName)) AS 'SERVICE_TAG_C',
                   ''                                                                                            AS 'POSITION_TYPE',
                   ''                                                                                            AS 'POSITION_NO',
                   --B.CustPN AS 'CUST_PART',  
                   CASE
                     WHEN B.CustPN = B.HHPN THEN ''
                     ELSE B.CustPN
                   END                                                                                           AS 'CUST_PART',
                   ''                                                                                            AS 'CUST_ECREV',
                   --LTRIM(RTRIM(C.manufacturerpn)) AS 'VENDOR_PART',  
                   CASE
                     WHEN Ltrim(Rtrim(C.manufacturerpn)) = B.HHPN THEN ''
                     ELSE Ltrim(Rtrim(C.manufacturerpn))
                   END                                                                                           AS 'VENDOR_PART',
                   ''                                                                                            AS 'POSITION_REQD',
                   ''                                                                                            AS 'REVISION'
            FROM   mfworkstatus AS A (NOLOCK)
                   RIGHT JOIN @SourceSSNDataInfo AS B
                           ON A.sysserialno = B.ActualSSN
                              AND B.[Level] = '03'
                   INNER JOIN mmprodmaster AS C (NOLOCK)
                           ON B.[Level] = '03'
                              AND B.HHPN = C.partno

            IF @@ERROR <> 0
              BEGIN
                  SET @_strSPError = 'Insert Level 03 Data Error.'

                  RAISERROR (@_strSPError,16,1)
              END
        END
  END

SELECT @xmlResult = (SELECT INPUT_MATERIAL,
                            INPUT_SERIAL,
                            PLANT_CODE,
                            CASE
                              WHEN OPERATION IS NULL THEN ''
                              ELSE OPERATION
                            END AS OPERATION,
                            [ORDER],
                            PART_NUMBER,
                            SERIAL_NUMBER,
                            CASE
                              WHEN FEATURE_CODE IS NULL THEN ''
                              ELSE FEATURE_CODE
                            END AS FEATURE_CODE,
                            MATERIAL_CLASS,
                            CHARACTERISTIC,
                            COMPONENT_TYPE,
                            CASE
                              WHEN WWN IS NULL THEN ''
                              ELSE WWN
                            END AS WWN,
                            CUST_SERIAL,
                            CASE
                              WHEN ECB IS NULL THEN ''
                              ELSE ECB
                            END AS ECB,
                            EQUIPMENT_NO,
                            MAC_ADDR,
                            SERVICE_TAG,
                            CUST_PART,
                            CUST_ECREV,
                            SYSTEM_SERIAL,
                            [ERROR_MESSAGE],
                            VENDOR_PART,
                            POSITION_REQD,
                            REVISION,
                            (SELECT (SELECT CASE Len(ZINDEX)
                                              WHEN 1 THEN '000' + CONVERT(VARCHAR, ZINDEX)
                                              WHEN 2 THEN '00' + CONVERT(VARCHAR, ZINDEX)
                                              WHEN 3 THEN '0' + CONVERT(VARCHAR, ZINDEX)
                                              WHEN 4 THEN CONVERT(VARCHAR, ZINDEX)
                                            END) AS ZINDEX,
                                    BM_LEVEL,
                                    PART_NUMBER,
                                    SERIAL_NUMBER,
                                    FEATURE_CODE,
                                    MATERIAL_CLASS,
                                    CHARACTERISTIC,
                                    COMPONENT_TYPE,
                                    CASE
                                      WHEN WWN IS NULL THEN ''
                                      ELSE WWN
                                    END          AS WWN,
                                    CUST_SERIAL,
                                    PARENT_MATNR,
                                    PARENT_SERNR,
                                    CASE
                                      WHEN ECB IS NULL THEN ''
                                      ELSE ECB
                                    END          AS ECB_C,
                                    EQUIPMENT_NO,
                                    MAC_ADDR_C,
                                    SERVICE_TAG_C,
                                    POSITION_TYPE,
                                    POSITION_NO,
                                    CUST_PART,
                                    CUST_ECREV,
                                    VENDOR_PART,
                                    POSITION_REQD,
                                    REVISION
                             FROM   @ZPE_ISTPCOMP
                             FOR XML PATH('ZPE_ISTPCOMP'), TYPE, ROOT('DETAIL'))
                     FROM   @STR_DATA
                     FOR XML PATH(''), TYPE)

SET @xml_ForSend = CONVERT(VARCHAR(MAX), @xmlResult)

SELECT '<?xml version="1.0" encoding="UTF-8"?><STR_DATA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="zpe_istpcomp.xsd">'
             + @xml_ForSend + '</STR_DATA>'
  
      
  END

最终改写为

DELETE @SourceSSNDataInfo;
--start recursion(递归),and insert into @SourceSSNDataInfo 
WITH cte(level, ParentSysSSN, ParentActualSSN, ParentHHPN, ParentCustPN,SerialSSN,ActualSSN,HHPN,CustPN,CategoryName,tempHHPN)
     AS (SELECT 0 AS level,
                cast('' as varchar(100)),
                cast(''as varchar(100)),
                cast( ''as varchar(100)),
                cast( ''as varchar(100)),
				cast(@strSSN as varchar(100)),
				cast(@_strActualSSN as varchar(100)),
				cast((CASE
					WHEN @virtualskuno = '' THEN @_strPartNO
					ELSE @virtualskuno
				END)  as varchar(100)),
				cast(c.partname  as varchar(100)),
				cast(a.categoryname  as varchar(100)),
				cast('' as varchar(100))
         FROM  mfsysproduct a inner join mmprodmaster c on a.skuno = c.partno
         WHERE  a.sysserialno = @_strActualSSN
         UNION ALL
         SELECT level + 1,
                cast(cte.SerialSSN as varchar(100)),
				cast(cte.ActualSSN as varchar(100)),
				cast(cte.HHPN as varchar(100)),
				cast(cte.CustPN as varchar(100)),
				cast((CASE
				   WHEN B.cserialno = B.partno THEN cte.SerialSSN
				   WHEN B.cserialno = (SELECT Field2
									   FROM   mfsysprodlink
									   WHERE  Field2 = B.cserialno
											  AND ProductID <> ''
											  AND cserialno LIKE '11S%') THEN (SELECT ProductID
																			   FROM   mfsysprodlink
																			   WHERE  Field2 = B.cserialno)
				   ELSE B.cserialno
				 END) as varchar(100)),
				 cast( (CASE
				   WHEN dbo.Fn_getssnbyinput(B.cserialno) = cte.ActualSSN THEN B.cserialno
				   ELSE dbo.Fn_getssnbyinput(B.cserialno)
				  END) as varchar(100)),
				 cast( Replace (B.partno, '-HH', '') as varchar(100)),
				 cast( C.partname as varchar(100)), 
				 cast( B.categoryname as varchar(100)),
				 cast(b.partno as varchar(100))
         FROM   cte  
                INNER JOIN mfsyscserial b inner join mmprodmaster c on c.partno = b.partno
                        ON b.sysserialno = cte.ActualSSN
                           AND NOT EXISTS (SELECT Value
                                           FROM   dbo.Fn_split (dbo.Fn_getluvalue('SFC-SEAGATE-VIRTUAL-MG', 'MG17R,MG660,MG661,MG662,MG666,MG12F,MG3C00,MG3C01,MG13F,MG529,MG530'), ',')
                                           WHERE  b.categoryname = Value))
INSERT INTO @SourceSSNDataInfo
SELECT Replicate('0', 2-Len(CONVERT(VARCHAR(2), cte.level)))
       + CONVERT(VARCHAR(2), cte.level) AS 'LevelNum',
        cte.ParentSysSSN      AS 'ParentSysSSN',--SerialSSN 
        cte.ParentActualSSN      AS 'ParentActualSSN',
        cte.ParentHHPN  AS 'ParentHHPN',       
       cte.ParentCustPN                       AS 'ParentCustPN',--CustPN
       cte.SerialSSN                            AS 'SerialSSN',--SerialSSN ,
       cte.ActualSSN                             AS 'ActualSSN ',--ActualSSN 
       (CASE
         WHEN cte.level = 1 THEN cte.HHPN
         ELSE cte.tempHHPN
       END)                              AS 'HHPN',--HHPN 
       cte.CustPN                       AS 'CustPN',--CustPN  
       cte.categoryname                 AS 'CategoryName'
FROM   cte order by cte.level

select * from @SourceSSNDataInfo

sql跨字段递归写法

declare @ssn varchar(50)='SHTJ8GKY00GEVYB';
with cte as 
(
   select a.sysserialno,cserialno,1 as level from mfsyscserial a   where  a.cserialno =@ssn
   union all 
   select a.sysserialno,'0',1 as level from mfworkstatus a   where  a.sysserialno =@ssn
   union all 
   select a.sysserialno,'0',1 as level from mfsysprodlink a   where  a.Field1 =@ssn 
   union all 
   select a.sysserialno,a.cserialno,level+1  from mfsyscserial a , cte,mfsysprodlink b  
   where( a.cserialno=cte.sysserialno  or a.cserialno = b.Field1)
   and b.SysSerialNo = cte.sysserialno
) select * from cte

猜你喜欢

转载自blog.csdn.net/m0_50623581/article/details/109216775
今日推荐