--- tags: MSSQL T-SQL description: --- Parsing XML file using T-SQL === #### [SpInsert_BEFORExml] ```mssql Begin set nocount on declare @Xml XML, @hDoc AS INT declare @sql nvarchar(256); declare @DeviceID as varchar(50) declare @CollectionTime as varchar(30) declare @SubstrateId as varchar(50) declare @LotId as varchar(50) declare @GoodDevices as int declare @SupplierName as varchar(50) declare @Delete as smallint declare @xmlFile as varchar(255) --測試的xml檔 set @xmlFile = N'D:\Thinning\B2B\VIS\Before\2019\201910\GBW384.1-E142.XML' ----------bulkcolumn------------ --使用bulkcolumn讀取大檔案 --語法: --SELECT BulkColumn FROM OPENROWSET (BULK 'c:\temp\mytxtfile.txt', SINGLE_CLOB) MyFile --參數 --SINGLE_BLOB,用二進位讀取一個文件(最大值) --SINGLE_CLOB,用varchar讀取一個文件(最大值) --SINGLE_NCLOB,用nvarchar讀取一個文件(最大值) -----------sp_executesql-------- --使用sp_executesql動態組合sql --語法 /* sp_executesql [ @stmt = ] statement [ { , [ @params = ] N'@parameter_name data_type [ OUT | OUTPUT ][ ,...n ]' } { , [ @param1 = ] 'value1' [ ,...n ] } ] */ set @sql='SELECT @Xml=BulkColumn FROM OPENROWSET(BULK '''+@xmlFile+''', SINGLE_BLOB) AS T' exec sp_executesql @stmt=@sql, @param=N'@Xml XML OUT', @Xml=@Xml OUT select @Xml; --DeviceID with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') select Top 1 @DeviceID=C.value('@LayoutId','varchar(50)') from @Xml.nodes('/MapData/Layouts/Layout') as XTAB(C); --BEFOREhead/BEFOREbin/BEFOREmapRow declare CursorXML cursor for with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') select SubstrateId = C.value('@SubstrateId','varchar(50)'), LotId = C.value('LotId[1]','varchar(50)'), GoodDevices = C.value('GoodDevices[1]','int'), SupplierName = C.value('SupplierName[1]','varchar(50)') from @Xml.nodes('/MapData/Substrates/Substrate') as XTAB(C); --set @Delete = 1 open CursorXML fetch next from CursorXML into @SubstrateId, @LotId, @GoodDevices, @SupplierName while @@FETCH_STATUS = 0 begin -- delete BEFOREhead --if @Delete=1 begin -- set @Delete = 0 -- delete from [CIMDB].[dbo].[BEFOREhead] where LotNo=@LotId --delete from [CIMDB].[dbo].[BEFOREmapRowVIS] where LotNo=@LotId -- end; -- BEFOREhead delete from [CIMDB].[dbo].[BEFOREhead] where LotNo=@LotId and WaferID=@SubstrateId; --CollectionTime=@CollectionTime with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') select top 1 @CollectionTime=C.value('../../../@MapVersion','varchar(30)') from @Xml.nodes('/MapData/SubstrateMaps/SubstrateMap/Overlay/BinCodeMap/BinDefinitions/BinDefinition') as XTAB(C) where C.value('../../../../@SubstrateId','varchar(50)')=@SubstrateId; --with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') --select top 1 @DeviceID=left(C.value('../../../@LayoutSpecifier','varchar(50)'), charindex('/', C.value('../../../@LayoutSpecifier','varchar(50)'))-1) --left(C.value('../../../@LayoutSpecifier','varchar(50)'), 6) -- from @Xml.nodes('/MapData/SubstrateMaps/SubstrateMap') as XTAB(C) -- where C.value('../../../../@SubstrateId','varchar(50)')=@SubstrateId; insert into [CIMDB].[dbo].[BEFOREhead](CollectionTime, LotNo, WaferID, DeviceID, GoodDies, SupplierName, xmlFile) values(@CollectionTime, @LotId, @SubstrateId, @DeviceID, @GoodDevices, @SupplierName, @xmlFile); -- BEFOREbin with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') insert into [CIMDB].[dbo].[BEFOREbin] select @CollectionTime, --Overlay_MapVersion = C.value('../../../@MapVersion','datetime') @LotId, @SubstrateId, C.value('@BinCode','char(3)'), C.value('@BinDescription','varchar(32)'), C.value('@BinCount','int'), case when Upper(C.value('@BinQuality','varchar(32)'))='PASS' then 1 else 0 end, C.value('@Pick','bit') from @Xml.nodes('/MapData/SubstrateMaps/SubstrateMap/Overlay/BinCodeMap/BinDefinitions/BinDefinition') as XTAB(C) where C.value('../../../../@SubstrateId','varchar(50)')=@SubstrateId; -- BEFOREmapRow with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') insert into [CIMDB].[dbo].[BEFOREmapRow] select @CollectionTime, @LotId, @SubstrateId, ROW_NUMBER() over (Partition by SubstrateId order by SubstrateId, RowsX desc), BinCode from (select SubstrateId = C.value('../../../@SubstrateId','varchar(50)'), RowsX=ROW_NUMBER() over (order by (select 1000)), BinCode = C.value('.','varchar(max)') from @Xml.nodes('/MapData/SubstrateMaps/SubstrateMap/Overlay/BinCodeMap/BinCode') as XTAB(C) ) A where A.SubstrateId=@SubstrateId fetch next from CursorXML into @SubstrateId, @LotId, @GoodDevices, @SupplierName end close CursorXML deallocate CursorXML; /* -- BEFOREmapRowVIS with XMLNAMESPACES(default 'urn:semi-org:xsd.E142-1.V1005.SubstrateMap') --delete from [CIMDB].[dbo].[BEFOREmapRowVIS] where insert into [CIMDB].[dbo].[BEFOREmapRowVIS] select @LotId, SubstrateId, ROW_NUMBER() over (Partition by SubstrateId order by SubstrateId, RowsX desc), CollectionTime, BinCode from (select SubstrateId = C.value('../../../@SubstrateId','varchar(50)'), RowsX=ROW_NUMBER() over (order by (select 1000)), CollectionTime = C.value('../../@MapVersion','varchar(30)'), BinCode = C.value('.','varchar(max)') from @Xml.nodes('/MapData/SubstrateMaps/SubstrateMap/Overlay/BinCodeMap/BinCode') as XTAB(C) ) A */ End ```