如何更正此 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
-- 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;