【发布时间】:2022-12-06 17:02:44
【问题描述】:
我在将新的 XML 格式导入我们的 MS SQL 数据库时遇到问题。 我的文档看起来与此类似。
<xml>
<data>
<email>test@mail.com</email>
<isActive>
true
<previous>false</previous>
</isActive>
</data>
</xml>
我的问题是,当我试图查询它时,我无法获得“isActive”列的值“true”,它返回“truefalse”,包括嵌套的“previous”节点。我不知道如何排除它或将它分成 2 个单独的列。
据我了解,这个 XML 应该是完全有效的。
我试过两种方法。 在使用 OPENXML 进行格式更新之前导入文件的当前 SQL 语句,我也试图在此处指定仅采用 isActive 的第一个实例,但第一个实例当然包括“上一个”节点,因为它包含在“isActive”节点。
select
email,
isActive
from
openxml(@xmlDocument, '/data')
with
(
email nvarchar(128) 'email',
isActive nvarchar(12) 'isActive[1]'
--isActive nvarchar(12) 'isActive'
)
使用 xquery
select
data.col.value('(email)[1]', 'nvarchar(128)'),
data.col.value('(isActive)[1]', 'nvarchar(12)')
from
@xmlDocument.nodes('/data') as data(col)
虽然该示例似乎有效,但实际上它在幕后包含了两个值(由于换行) 如果我尝试将其转换为布尔值,则会显示以下内容。
Msg 245, Level 16, State 1, Line 9 Conversion failed when converting the nvarchar value ' true false' to data type bit.
【问题讨论】:
标签: sql sql-server xml xquery openxml