SQL Server XML 解析空结果

Posted

技术标签:

【中文标题】SQL Server XML 解析空结果【英文标题】:SQL Server XML Parsing Null Result 【发布时间】:2020-08-22 21:32:23 【问题描述】:

您好,我有如下程序

USE [DB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[AdminTestSaveAnswer]
    @refQuestion xml
AS
BEGIN

    SET NOCOUNT ON;
    SELECT  
       Tbl.Col.value('@Id', 'int'),  
       Tbl.Col.value('@Question', 'varchar(max)'),  
       Tbl.Col.value('@CorrectAnswer', 'varchar(7)'),
       Tbl.Col.value('@Desc', 'varchar(max)')
    FROM   @refQuestion.nodes('//Root') Tbl(Col)

END

我运行类似的代码

EXEC [dbo].[SP_AdminTestSaveAnswer] '<Root>
  <Id>2</Id>
  <Question>(I) Yaşayan sanatçılara televizyonlarda pek yer verilmiyor. (II) Bunların içerisinde sürekli olarak ekranda olan tek sanatçı neredeyse Attila İlhan. (III) Demek ki ülkemizde edebiyatçılara, şairlere, romancılara, öykü ve deneme ustalarına ihtiyaç duyulmuyor artık. (III) Şahsen ben 1996’dan beri televizyonlarda anımsanmıyor, oralara çağrılmıyorum. (V) Diğer pek çok yazarın da akla geldiğini, zaman zaman da olsa ekrana davet edildiklerini sanmıyorum.
&lt;/br&gt;&lt;span&gt;&lt;b&gt;
Bu parçadaki numaralanmış cümlelerin hangisinde bir çıkarım söz konusudur?&lt;/b&gt;&lt;/span&gt;</Question>
  <CorrectAnswer>A</CorrectAnswer>
  <Desc>deded</Desc>
  <refTest>1</refTest>
  <Answers>
    <Id>2</Id>
    <Answer>I.</Answer>
    <Code>A</Code>
    <refQuestion>0</refQuestion>
  </Answers>
  <Answers>
    <Id>3</Id>
    <Answer>II.</Answer>
    <Code>B</Code>
    <refQuestion>0</refQuestion>
  </Answers>
  <Answers>
    <Id>4</Id>
    <Answer>III.</Answer>
    <Code>C</Code>
    <refQuestion>0</refQuestion>
  </Answers>
  <Answers>
    <Id>5</Id>
    <Answer>IV.</Answer>
    <Code>D</Code>
    <refQuestion>0</refQuestion>
  </Answers>
  <Answers>
    <Id>6</Id>
    <Answer>V.</Answer>
    <Code>E</Code>
    <refQuestion>0</refQuestion>
  </Answers>
</Root>'

结果我得到一行,但所有列都为空。我的失踪在哪里?

提前致谢

【问题讨论】:

仅供参考,sp_ 前缀由 Microsoft 保留,不应用于用户过程。这样做会产生多重影响,包括性能和可靠性。 至于为什么@Id会引用属性Id而不是节点;你想要(/Id/text())[1]//Root 也应该是 /Root 【参考方案1】:

@ 用于 xml 属性,您的数据在元素中。所以应该是这样的

SELECT  
   Tbl.Col.value('Id[1]', 'int'),  
   Tbl.Col.value('Question[1]', 'varchar(max)'),  
   Tbl.Col.value('CorrectAnswer[1]', 'varchar(7)'),
   Tbl.Col.value('Desc[1]', 'varchar(max)')
FROM   @refQuestion.nodes('/Root') Tbl(Col)

【讨论】:

以上是关于SQL Server XML 解析空结果的主要内容,如果未能解决你的问题,请参考以下文章

删除 SQL Server 中不同级别的空 XML 标记

如何读取 FOR XML SQL Server 查询的完整结果?

SQL Server 将查询结果集以XML形式展现 for xml path

如何从XML *向SQL Server DATE字段*中插入NULL

sql server 如何改变计算结果的值 如null改变为0

是否可以在 SQL Server 中查询空扩展属性?