最近在优化一个存储过程,存储执行太慢,且没有用递归写法,我负责改成递归形式
@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