首页 > 解决方案 > 选择带有 SQL XML 空元素的查询

问题描述

我编写了一个查询以从 XML 格式的表中获取数据,但如果列没有任何数据,则它不会在 XML 输出中返回数据。请让我知道如何解决这个问题。

即使它们在带有空标签的表列中没有数据,我也需要获取输出 - 像这样"</BatchEntryId>"。这BatchEntryId是表中的NULL

我的查询:

SELECT 
    Data.value('(/Data/Reference)[1]', 'nvarchar(10)') AS PolicyNumber,
    [RequestId],
    [BatchEntryId],
    [StatusCode],
    [PaymentMethodCode],
    Data.value('(/Data/Amount)[1]', 'nvarchar(10)') AS Amount
FROM 
    [dbo].[TransmissionData]
WHERE 
    RequestId = 2031070233
FOR XML RAW ('RequestRecord'), ELEMENTS, TYPE

我的输出:

<RequestRecord>
    <PolicyNumber>Policy034</PolicyNumber>
    <RequestId>2031070233</RequestId>
    <StatusCode>A</StatusCode>
    <PaymentMethodCode>1XCC</PaymentMethodCode>
    <Amount>200.00</Amount>
</RequestRecord>

问题是'BatchEntryId'我没有在输出 XML 中得到,因为该列具有 NULL 值。但我也需要在输出 XML 中作为空标记,就像这样</BatchEntryId>

请告诉我,如何解决这个问题。

我正在寻找这样的输出:

<RequestRecord>
    <PolicyNumber>Policy034</PolicyNumber>
    <RequestId>2031070233</RequestId>
    <BatchEntryId/>
    <StatusCode>A</StatusCode>
    <PaymentMethodCode>1XCC</PaymentMethodCode>
    <Amount>200.00</Amount>
</RequestRecord>

标签: sqlsql-serversql-server-2012for-xml

解决方案


你可以ISNULL把它变成一个空字符串

SELECT Data.value('(/Data/Reference)[1]', 'nvarchar(10)') as  PolicyNumber
       ,[RequestId]
       ,ISNULL([BatchEntryId], '') AS BatchEntryId
       ,[StatusCode]
       ,[PaymentMethodCode]
       ,Data.value('(/Data/Amount)[1]', 'nvarchar(10)') as  Amount
    FROM [dbo].[TransmissionData]
    WHERE RequestId = 2031070233
    FOR XML RAW ('RequestRecord'), ELEMENTS, TYPE

如果BatchEntryId不是varchar,或者nvarchar你应该先施放它

ISNULL(CAST(BatchEntryId AS varchar(30)), '') AS BatchEntryId

请注意,SQL Server 将其生成为

<BatchEntryId></BatchEntryId>

然而,这在 XML 中的语义等价于

<BatchEntryId/>

推荐阅读