导入sql server中的所有xml文件

问题描述 投票:0回答:1

如何更正此 sql 查询以读取 C:\Files\ 文件夹中激发的所有 xml 文件,而不仅仅是 Test.xml 文件

create table Projet (UID int, nom varchar(50), prenom varchar(50), matricule varchar(50), lien varchar(100))

INSERT INTO Projet (UID, nom, prenom,matricule,lien)
SELECT
    page.value('(item[@name="UID(Zonal OCR)"]/@value)[1]', 'INT') AS UID,
    page.value('(item[@name="nom(Zonal OCR)"]/@value)[1]', 'VARCHAR(50)') AS nom,
    page.value('(item[@name="prenom(Zonal OCR)"]/@value)[1]', 'VARCHAR(50)') AS prenom,
    page.value('(item[@name="matricule(Zonal OCR)"]/@value)[1]', 'VARCHAR(50)') AS matricule,
    page.value('(item[@name="lien"]/@value)[1]', 'VARCHAR(100)') AS lien 

FROM (SELECT CAST(MY_XML AS xml)
      FROM OPENROWSET(BULK 'C:\Files\Test.xml', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
      CROSS APPLY MY_XML.nodes('root/page') AS MY_XML (page);
sql sql-server xml ssms
1个回答
0
投票

请尝试以下解决方案。

SQL

-- DDL and sample data population, start
USE tempdb;
GO

DROP TABLE IF EXISTS dbo.targetTable;

CREATE TABLE dbo.targetTable (
    ID INT IDENTITY(1, 1) PRIMARY KEY,
    FullyQualifiedFileName NVARCHAR(255)
);

CREATE TABLE dbo.Projet (UID INT, nom VARCHAR(50), prenom VARCHAR(50), matricule VARCHAR(50), lien VARCHAR(100));
-- DDL and sample data population, end

DECLARE @directory NVARCHAR(255) = N'c:\Files\'
   , @fileWildcard NVARCHAR(10) = N'*.xml';

-- Step #1
-- Load file names from a directory into the targetTable
INSERT INTO dbo.targetTable (FullyQualifiedFileName)
SELECT FullyQualifiedFileName = @directory + file_or_directory_name
   --, level, is_directory, creation_time, size_in_bytes
FROM sys.dm_os_enumerate_filesystem(@directory, @fileWildcard);

-- test
SELECT * FROM dbo.targetTable;

--Step #2
-- Loop through the targetTable table, shred XML, and load data
DECLARE @ID INT
   , @FullyQualifiedFileName NVARCHAR(255)
   , @sql NVARCHAR(MAX) 
   , @RowCount INT = (SELECT COUNT(*) FROM dbo.targetTable);

WHILE @RowCount > 0 BEGIN
   SELECT @FullyQualifiedFileName = FullyQualifiedFileName, @ID = ID
   FROM dbo.targetTable 
   ORDER BY ID DESC OFFSET @RowCount - 1 ROWS FETCH NEXT 1 ROWS ONLY;
   
   -- do whatever needed, apply any logic, call stored procedures, etc.
   -- The variable you pass if doesn’t supported by the placeholder (%s, %i) then it will throw an error.
   SET @sql = FORMATMESSAGE('INSERT INTO Projet (UID, nom, prenom,matricule,lien)
    SELECT
        page.value(''(item[@name="UID(Zonal OCR)"]/@value)[1]'', ''INT'') AS UID,
        page.value(''(item[@name="nom(Zonal OCR)"]/@value)[1]'', ''VARCHAR(50)'') AS nom,
        page.value(''(item[@name="prenom(Zonal OCR)"]/@value)[1]'', ''VARCHAR(50)'') AS prenom,
        page.value(''(item[@name="matricule(Zonal OCR)"]/@value)[1]'', ''VARCHAR(50)'') AS matricule,
        page.value(''(item[@name="lien"]/@value)[1]'', ''VARCHAR(100)'') AS lien 
FROM (SELECT CAST(MY_XML AS xml)
      FROM OPENROWSET(BULK N''%s'', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
      CROSS APPLY MY_XML.nodes(''root/page'') AS MY_XML (page);', @FullyQualifiedFileName);

   PRINT @sql;
   EXEC sp_executesql @sql;

   SET @RowCount -= 1;
END

-- test
SELECT * FROM dbo.Projet;
© www.soinside.com 2019 - 2024. All rights reserved.