Eud*_*des 5 xml sql-server import sql-server-2012
每个星期五我都必须将几个(有时超过 300 个)XML 文件导入到 2 个表中。
其中一张表的结构R000000如下所示:
R00000010 | R00000020 | R00000030 | R00000040 | R00000050 | R00000060
---------- ------------ ---------- ----------- ----------- ----------
R000000 | I | 0002 | 1 | 2 | 0026
R000000 | I | 0003 | 1 | 2 | 0025
R000000 | I | 0004 | 1 | 2 | 0021
R000000 | I | 0006 | 1 | 2 | 0023
R000000 | I | 0001 | 1 | 2 | 0022
Run Code Online (Sandbox Code Playgroud)
^ 每行对应一个 XML 文件。
结构不会改变,只有数据(在这种情况下,我已经放置了一些随机的,例如)。
XML 文件如下所示:
R00000010 | R00000020 | R00000030 | R00000040 | R00000050 | R00000060
---------- ------------ ---------- ----------- ----------- ----------
R000000 | I | 0002 | 1 | 2 | 0026
R000000 | I | 0003 | 1 | 2 | 0025
R000000 | I | 0004 | 1 | 2 | 0021
R000000 | I | 0006 | 1 | 2 | 0023
R000000 | I | 0001 | 1 | 2 | 0022
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?我目前正在 Access 中执行此操作。
尝试一下类似下面的东西......
显然,您需要插入适合您环境的变量,检查数据类型(可能需要添加逻辑以保留前导零?),从最终临时表更改为常规表等。
对于我来说,从 XML 文件导入到临时表,之后无需删除文件,效果很好,但使用另一个 xp_cmdshell 命令添加逻辑以从 UNC 路径删除文件应该不会太困难。
DECLARE @folder AS VARCHAR(1000) = '\\servername\sharename\folder\subfolder1\'
DECLARE @command VARCHAR(500) = 'DIR /B "' + @folder + '*.xml"'
DECLARE @file VARCHAR(100)
DECLARE @filesinafolder TABLE (filenameswithfolder VARCHAR(500))
DECLARE @sql NVARCHAR(4000)
-- create global temp table
IF OBJECT_ID('tempdb..##XMLImport') IS NOT NULL
DROP TABLE ##XMLImport
CREATE TABLE ##XMLImport (
R00000010 VARCHAR(7)
,R00000020 VARCHAR(1)
,R00000030 INT
,R00000040 INT
,R00000050 INT
,R00000060 INT
)
INSERT INTO @filesinafolder
EXEC master..xp_cmdshell @command
-- create cursor
DECLARE filecurs CURSOR
FOR
SELECT REPLACE(filenameswithfolder, @folder, '') AS filenames
FROM @filesinafolder
WHERE filenameswithfolder IS NOT NULL
OPEN filecurs
FETCH NEXT
FROM filecurs
INTO @file
IF @file = 'FILE NOT FOUND'
GOTO exitprocessing
WHILE @@fetch_status != - 1
BEGIN
SET @sql = 'DECLARE @X XML
SELECT @X = P
FROM OPENROWSET(BULK ''' + @folder + '' + @file + ''', SINGLE_BLOB) AS Products(P)
DECLARE @iX INT
EXEC sp_xml_preparedocument @iX OUTPUT
,@X
SELECT *
INTO #XMLResults
FROM OPENXML(@iX, ''/*/*'', 2) WITH (
R00000010 VARCHAR(7)
,R00000020 VARCHAR(1)
,R00000030 INT
,R00000040 INT
,R00000050 INT
,R00000060 INT
)
EXEC sp_xml_removedocument @iX
INSERT INTO ##XMLImport
SELECT R00000010
,R00000020
,R00000030
,R00000040
,R00000050
,R00000060
FROM #XMLResults'
--PRINT @sql
EXEC sp_executesql @sql
-- process next file
FETCH NEXT
FROM filecurs
INTO @file
END
exitprocessing:
-- clean up
CLOSE filecurs
DEALLOCATE filecurs
SELECT *
FROM ##XMLImport
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3037 次 |
| 最近记录: |