[英]SQL Server: How to check child node exist or not in xml when using xquery
这就是我在 XML 数据中迭代并从 XML 中提取值的方式。
我的 XML
<?xml version="1.0" encoding="utf-16"?>
<Root>
<PeriodData>
<PeriodType>ANNUALONLY</PeriodType>
<Period>2010 FY</Period>
</PeriodData>
<PeriodData>
<PeriodType>ANNUALONLY</PeriodType>
<Period>2011 FY</Period>
<IsDeleted/>
</PeriodData>
<PeriodData>
<PeriodType>ANNUALONLY</PeriodType>
<Period>2011 FY</Period>
<IsDeleted>Y</IsDeleted>
</PeriodData>
</Root>
我在 SP 中的代码,我在循环中迭代并通过 xquery 从 XML 中提取数据:
DECLARE @PeriodType VARCHAR(20), @Period VARCHAR(30), @IsDeleted CHAR(1)
DECLARE @MasterID INT
DECLARE @i INT, @cnt INT = @Periods.value('count(/Root/PeriodData)', 'INT');
SET @i = 1;
WHILE @i <= @cnt BEGIN
SELECT @PeriodType = col.value('(PeriodType/text())[1]','VARCHAR(20)')
, @Period = col.value('(Period/text())[1]','VARCHAR(30)')
, @IsDeleted = col.value('(IsDeleted/text())[1]','VARCHAR(30)')
FROM @Periods.nodes('/Root/PeriodData[position() = sql:variable("@i")]') AS tab(col);
IF NOT EXISTS (SELECT * FROM tblCalenderDetail WHERE PeriodType=@PeriodType AND Period=@Period AND IsDeleted='Y')
BEGIN
INSERT INTO tblCalenderDetail (MasterID,PeriodType,Period,IsDeleted)
VALUES(@MasterID,@PeriodType,@Period,'N')
END
ELSE
BEGIN
UPDATE tblCalenderDetail SET IsDeleted='N' WHERE PeriodType=@PeriodType AND Period=@Period
END
SET @i += 1;
END
请将isDeleted见子节点的第一条记录不存在,请将isDeleted和子节点确实存在在第二排,但有空值。
那么在while循环中迭代时如何检查IsDeleted子节点是否存在?
我在下面的代码中尝试了这个来检查IsDeleted 节点是否存在于每一行中,但没有工作,而是抛出错误。
@IsDeleted = IIF(col.exist('//IsDeleted') , col.value('(IsDeleted/text())[1]','VARCHAR(30)') ,'N')
在循环中,如果要检查IsDeleted
节点是否存在,则其值将存储在@IsDeleted
变量中。 如果节点不存在,那么我将在 @IsDeleted 变量中存储“N” 。 如何实现这一目标?
请给我一些指导方针。
我得到了解决方案。 这我用ISNULL(col.value('(IsDeleted/text())[1]','VARCHAR(30)'), 'N')
declare @xml xml=N'<?xml version="1.0" encoding="utf-16"?>
<Root>
<PeriodData>
<PeriodType>ANNUALONLY</PeriodType>
<Period>2010 FY</Period>
</PeriodData>
<PeriodData>
<PeriodType>ANNUALONLY</PeriodType>
<Period>2011 FY</Period>
<IsDeleted/>
</PeriodData>
<PeriodData>
<PeriodType>ANNUALONLY</PeriodType>
<Period>2011 FY</Period>
<IsDeleted>Y</IsDeleted>
</PeriodData>
</Root>'
DECLARE @PeriodType VARCHAR(20), @Period VARCHAR(30), @IsDeleted CHAR(1)
DECLARE @MasterID INT
DECLARE @i INT, @cnt INT = @xml.value('count(/Root/PeriodData)', 'INT');
SET @i = 1;
WHILE @i <= @cnt BEGIN
SELECT @PeriodType = col.value('(PeriodType/text())[1]','VARCHAR(20)')
, @Period = col.value('(Period/text())[1]','VARCHAR(30)')
, @IsDeleted = ISNULL(col.value('(IsDeleted/text())[1]','VARCHAR(30)'), 'N')
FROM @xml.nodes('/Root/PeriodData[position() = sql:variable("@i")]') AS tab(col);
PRINT @PeriodType + ' '+@Period+' '+@IsDeleted
SET @i += 1;
END
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.