You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需CROSS APPLY与WHERE,解析SQL Server指定XML的方案

SQL Server解析SurveyQLADetails XML:无CROSS APPLY/WHERE的替代方案

示例XML结构

假设你的XML数据结构如下:

<SurveyQLADetails>
  <QlaDetail>
    <QuestionID>1</QuestionID>
    <QuestionText>您的年龄?</QuestionText>
    <Answer>25</Answer>
  </QlaDetail>
  <QlaDetail>
    <QuestionID>2</QuestionID>
    <QuestionText>您的职业?</QuestionText>
    <Answer>程序员</Answer>
  </QlaDetail>
</SurveyQLADetails>

原CROSS APPLY实现(参考)

你之前可能用的是这类写法:

SELECT 
    x.value('(QuestionID/text())[1]', 'INT') AS QuestionID,
    x.value('(QuestionText/text())[1]', 'NVARCHAR(100)') AS QuestionText,
    x.value('(Answer/text())[1]', 'NVARCHAR(100)') AS Answer
FROM 
    YourTable
CROSS APPLY 
    YourXmlColumn.nodes('/SurveyQLADetails/QlaDetail') AS T(x)

方案1:使用OPENXML解析(完全无需CROSS APPLY/WHERE)

这种方式通过系统存储过程处理XML,直接映射为表格数据:

-- 若XML来自表列,可替换为SELECT @XmlData = YourXmlColumn FROM YourTable
DECLARE @XmlData XML = '<SurveyQLADetails>
  <QlaDetail>
    <QuestionID>1</QuestionID>
    <QuestionText>您的年龄?</QuestionText>
    <Answer>25</Answer>
  </QlaDetail>
  <QlaDetail>
    <QuestionID>2</QuestionID>
    <QuestionText>您的职业?</QuestionText>
    <Answer>程序员</Answer>
  </QlaDetail>
</SurveyQLADetails>'

DECLARE @XmlHandle INT
EXEC sp_xml_preparedocument @XmlHandle OUTPUT, @XmlData

SELECT 
    QuestionID,
    QuestionText,
    Answer
FROM 
    OPENXML(@XmlHandle, '/SurveyQLADetails/QlaDetail', 2)
    WITH (
        QuestionID INT 'QuestionID',
        QuestionText NVARCHAR(100) 'QuestionText',
        Answer NVARCHAR(100) 'Answer'
    )

EXEC sp_xml_removedocument @XmlHandle

方案2:直接调用.nodes(单XML变量场景无需CROSS APPLY)

如果是单独的XML变量而非表中列,可直接从nodes结果集查询,无需关联操作:

DECLARE @XmlData XML = '<SurveyQLADetails>
  <QlaDetail>
    <QuestionID>1</QuestionID>
    <QuestionText>您的年龄?</QuestionText>
    <Answer>25</Answer>
  </QlaDetail>
  <QlaDetail>
    <QuestionID>2</QuestionID>
    <QuestionText>您的职业?</QuestionText>
    <Answer>程序员</Answer>
  </QlaDetail>
</SurveyQLADetails>'

SELECT 
    x.value('(QuestionID/text())[1]', 'INT') AS QuestionID,
    x.value('(QuestionText/text())[1]', 'NVARCHAR(100)') AS QuestionText,
    x.value('(Answer/text())[1]', 'NVARCHAR(100)') AS Answer
FROM 
    @XmlData.nodes('/SurveyQLADetails/QlaDetail') AS T(x)

内容的提问来源于stack exchange,提问作者Janki Gabani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 06:42:56