我正在使用 MS SQL Server 2012。
我尝试将函数 openxml 与以下语句/xml 数据一起使用:
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SET @SQL = '<master>
<List>
<Col>
<DisplayFieldName>Peter</DisplayFieldName>
<Value>
<string>Yes</string>
</Value>
</Col>
<Col>
<DisplayFieldName>Tom</DisplayFieldName>
<Value>
<string>No</string>
</Value>
</Col>
<Col>
<DisplayFieldName>Numerics</DisplayFieldName>
<Value>
<string>50 </string>
<string>100 </string>
<string>150 </string>
<string>200 </string>
</Value>
</Col>
</List>
</master>'
SELECT @XML = CONVERT(XML,@SQL)
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT *
FROM OPENXML(@hDoc, '/master/List/Col/Value',3)
WITH
(
string [varchar](max)
)
EXEC sp_xml_removedocument @hDoc
结果是这样的:
string
1 Yes
2 No
3 50
我明白为什么会发生这种情况,但实际上我只想显示所有数值(50,100,150,200)或至少显示该字段中的所有值(是、否、50、100、150、200),这也足够了。
最佳答案
FROM OPENXML
已过时,不应再使用(有一些罕见的异常(exception)...)
您应该使用 XML 方法,例如 .value()
、.nodes()
、.query()
和 .exist()
.
尝试一下:它是完全内联的(临时),更易于阅读和维护 - 而且速度更快:
DECLARE @XML AS XML;
SET @XML = '<master>
<List>
<Col>
<DisplayFieldName>Peter</DisplayFieldName>
<Value>
<string>Yes</string>
</Value>
</Col>
<Col>
<DisplayFieldName>Tom</DisplayFieldName>
<Value>
<string>No</string>
</Value>
</Col>
<Col>
<DisplayFieldName>Numerics</DisplayFieldName>
<Value>
<string>50 </string>
<string>100 </string>
<string>150 </string>
<string>200 </string>
</Value>
</Col>
</List>
</master>';
SELECT C.value('DisplayFieldName[1]','nvarchar(max)') AS DisplayFieldName
,V.value('.','nvarchar(max)') AS string
FROM @XML.nodes('/master/List/Col') AS A(C)
CROSS APPLY C.nodes('Value/string') AS B(V);
结果
DisplayFieldName string
----------------------------
Peter Yes
Tom No
Numerics 50
Numerics 100
Numerics 150
Numerics 200
更新
如果您只需要数字,您可以将相同的 XQuery 过滤器附加到 .nodes()
XPath,如 Alex 所指出的:/master/List/Col[DisplayFieldName= “数字”]
关于sql - 具有异步结构的openxml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38729583/