sql-server - 仅将特定 XML 参数导入 SQL Server
问题描述
我一直在阅读和阅读如何将 xml 导入我的 SQL Server,我非常接近。
我遇到的最后一个问题是 xml 文件中有数百个项目。有些列出了一些附加参数,因此导入错误并且不会加载。
我只需要这些参数中的 5 个来拉入,但不知道如何拉出这些参数。
我的代码在这里;如果我只是将一两个设备放在testing.xml
只有这些参数的文件中,它就可以工作。如果其中一个设备中有新参数,则它不起作用。
我真的只需要deviceId
,deviceDescription
并且versionModelNumber
在所有记录中。
INSERT INTO DeviceDB (publicDeviceRecordKey, publicVersionStatus, deviceRecordStatus, publicVersionNumber, publicVersionDate, deviceCommDistributionEndDate, deviceCommDistributionStatus, deviceId, deviceIdType, deviceIdIssuingAgency, containsDINumber, pkgQuantity, pkgDiscontinueDate, pkgStatus, pkgType, brandName, versionModelNumber, catalogNumber, dunsNumber, companyName, deviceCount, deviceDescription, DMExempt, premarketExempt, deviceHCTP, deviceKit, deviceCombinationProduct, singleUse, lotBatch, serialNumber, manufacturingDate, expirationDate, donationIdNumber, labeledContainsNRL, labeledNoNRL, MRISafetyStatus, rx, otc, phone, phoneExtension, email, gmdnPTName, gmdnPTDefinition, productCode, productCodeName, deviceSterile, sterilizationPriorToUse)
SELECT
MY_XML.Customer.query('publicDeviceRecordKey').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('publicVersionStatus').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('deviceRecordStatus').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('publicVersionDate').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('publicPublishDate').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('publicCommDistributionEndDate').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('publicCommDistributionStatus').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/deviceId').value('.', 'VARCHAR(150)'),
MY_XML.Customer.query('identifiers/identifier/deviceIdType').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/deviceIdIssuingAgency').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/containsDINumber').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/pkgQuantity').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/pkgDiscontinueDate').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/pkgStatus').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('identifiers/identifier/pkgType').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('brandName').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('versionModelNumber').value('.', 'VARCHAR(300)'),
MY_XML.Customer.query('catalogNumber').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('dunsNumber').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('companyName').value('.', 'VARCHAR(300)'),
MY_XML.Customer.query('deviceCount').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('deviceDescription').value('.', 'VARCHAR(300)'),
MY_XML.Customer.query('DMExempt').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('premarketExempt').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('deviceHCTP').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('deviceKit').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('deviceCombinationProduct').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('singleUse').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('lotBatch').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('serialNumber').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('manufacturingDate').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('expirationDate').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('donationIdNumber').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('labeledContainsNRL').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('labeledNoNRL').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('MRISafteyStatus').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('rx').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('otc').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('contacts/customerContact/phone').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('contacts/customerContact/phoneExtension').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('contacts/customerContact/email').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('gmdnTerms/gmdn/gmdnPTName').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('gmdnTerms/gmdn/gmdnPTDefinition').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('productCodes/fdaProductCode/productCode').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('productCodes/fdaProductCode/productCodeName').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('sterilization/deviceSterile').value('.', 'VARCHAR(50)'),
MY_XML.Customer.query('sterilization/sterilizationPriorToUse').value('.', 'VARCHAR(50)')
FROM
(SELECT CAST(MY_XML AS xml)
FROM OPENROWSET(BULK 'C:\testing.xml', SINGLE_BLOB) AS T(MY_XML)) AS T(MY_XML)
CROSS APPLY
MY_XML.nodes('device') AS MY_XML (Customer);`
解决方案
尝试将 XQuery 移入 value() 函数并删除 query() 函数。XQuery 将需要更新以确保通过“[1]”仅返回一个值,即使从不超过 1 个值。如果该值不存在,则 value() 将返回 null。实际上,对 null query() 结果调用 value() 可能是问题所在。
顺便说一句,如果可以有超过 1 个值,您必须决定是否需要数据。如果是这样,那将是不同的。
https://docs.microsoft.com/en-us/sql/t-sql/xml/value-method-xml-data-type?view=sql-server-ver15
我不经常使用 XML,所以我需要大约 100 次尝试才能获得正确的语法和路径。这是您选择的第一行的我的 WAG。
MY_XML.Customer.value('(./publicDeviceRecordKey)[1]', 'VARCHAR(50)') as [publicDeviceRecordKey]
推荐阅读
- html - 为什么这些 Div 不均匀对齐?
- typescript - Multer 句柄错误,打字稿类型问题
- angular - matSort 动态垫表角度
- android-studio - 颤振酒吧获取
- vue.js - 如何在计算属性中使用道具?
- android - OpenCV 无法导入 Android Studio
- c# - 如何使用顶级 Program.cs 在 C# 9 中处理 {STAThread]
- search - vscode - 在状态栏中显示查找标志(匹配大小写/整个单词/正则表达式)
- python - 具有 maximum_concurrent_rpcs 限制的异步 gRCP 服务器引发异常
- r - 如何在 r 中使用 ts_plot 绘制具有 2 组推文数据的 2 个时间序列?