Sql server 跳过SQL生成的XML中的空参数
我想做什么?:从SQL Server 2014生成XML 问题:某些列包含NULL-这些列的行为类似于我的XML中的属性。如果属性的值为空/null,则我的验证器不接受该属性 例如: 期望结果 这是我的密码Sql server 跳过SQL生成的XML中的空参数,sql-server,xml,Sql Server,Xml,我想做什么?:从SQL Server 2014生成XML 问题:某些列包含NULL-这些列的行为类似于我的XML中的属性。如果属性的值为空/null,则我的验证器不接受该属性 例如: 期望结果 这是我的密码 WITH Inreg AS ( SELECT DISTINCT * FROM dbo.C1_UE C1
WITH Inreg
AS ( SELECT DISTINCT
*
FROM dbo.C1_UE C1
INNER JOIN dbo.C2_UE C2 ON C1.nrp = C2.ContractNumber
ORDER BY C1.nrp
OFFSET @Page * @PageSize ROWS FETCH NEXT @PageSize
ROWS ONLY
),
TotalP
AS ( SELECT COUNT(ContractNumber) AS Nr_pers
FROM dbo.C2_UE
),
TotalS
AS ( SELECT REPLACE(ROUND(SUM(C1.Val_capital)
+ SUM(C3.Suma3), 0), '.00', '') AS total
FROM dbo.C1_UE C1
LEFT JOIN dbo.C3_UE C3 ON C1.nrp = C3.ContractNumber
)
SELECT REPLACE(( SELECT '' as 1
( SELECT TotalP.Nr_pers
FROM TotalP
) AS '@nr_pers' ,
( SELECT TotalS.total
FROM TotalS
) AS '@total' ,
( SELECT *
--pers
( SELECT
*
FROM @C2 C
INNER JOIN @C1 CC ON CC.nrp = C.ContractNumber
WHERE CC.nrp = C1.nrp
FOR
XML PATH('pers') ,
TYPE
) ,
--acc
( SELECT *
FROM @C3 c
INNER JOIN @C1 CC ON CC.nrp = c.ContractNumber
WHERE CC.nrp = C1.nrp
FOR
XML PATH('even') ,
TYPE
)
FROM @C1 C1
FOR
XML PATH('poli') ,
TYPE
)
FOR
XML PATH('decl400')
), '<decl400',
'<decl400 xmlns="mfp:aa:dd:d403:dec:v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="mfp:mfp:aa:dd:d403:dec:v1 file:/C:/Users/a/Desktop/dec.xsd" ');
@C1、@C2和@C3是上面声明的表,@pageSize和@pageNumber也是固定值。如果我没有弄错,您需要的是标准行为:
DECLARE @Dummy TABLE(number INT,Type INT,Trat INT,Frecv INT);
INSERT INTO @Dummy VALUES
(31301879,NULL,1,2)
,(73229903,2,NULL,2)
,(73229903,2,1,2);
SELECT number AS [@number]
,Type AS [@Type]
,Trat AS [@Trat]
,Frecv AS [@Frecv]
FROM @Dummy
FOR XML PATH('polita')
-结果
<polita number="31301879" Trat="1" Frecv="2" />
<polita number="73229903" Type="2" Frecv="2" />
<polita number="73229903" Type="2" Trat="1" Frecv="2" />
如果需要空字符串而不是空字符串,则可以使用
我的第一个答案是+1,这可能有助于您理解XML是如何处理空字段还是空字段的,但如果您不想指定所有字段,另一种选择是使用XML RAW。比如说
Declare @YourTable table (number int,[Type] int,Trat int,Frecv int)
Insert Into @YourTable values
(31301879, NULL,1 , 2)
,(73229903, 2 ,NULL, 2)
,(73229903, 2 ,1 , 2)
Select * from @YourTable for XML RAW('polita')
返回
编辑-感谢Shnugo的原始“polita”
不清楚期望的结果。也许您可以编辑您的问题并添加此已编辑的!我想要的结果是在第二个引号中,这是最简单的方法@Shnugo我犹豫了一下,因为您在XML/字符串操作方面正确地警告了我。John,我必须承认我已经停止阅读FOR XML RAW,请尝试从@YourTable FOR XML RAW'polita'中选择*。无需采取进一步行动。。。字符串连接应该不是必需的…@Shnugo谢谢你的提示!关于如何更改默认设置,我脑子里出了个屁。这就是朋友的作用:-你好!这样做很好。但是,当我试图在其中添加另一个元素时,它不会以这种方式工作。我需要在FOR->FOR XML路径'polita'中使用TYPE,键入
DECLARE @Dummy TABLE(number INT,Type INT,Trat INT,Frecv INT);
INSERT INTO @Dummy VALUES
(31301879,NULL,1,2)
,(73229903,2,NULL,2)
,(73229903,2,1,2);
SELECT number AS [@number]
,Type AS [@Type]
,Trat AS [@Trat]
,Frecv AS [@Frecv]
FROM @Dummy
FOR XML PATH('polita')
<polita number="31301879" Trat="1" Frecv="2" />
<polita number="73229903" Type="2" Frecv="2" />
<polita number="73229903" Type="2" Trat="1" Frecv="2" />
Declare @YourTable table (number int,[Type] int,Trat int,Frecv int)
Insert Into @YourTable values
(31301879, NULL,1 , 2)
,(73229903, 2 ,NULL, 2)
,(73229903, 2 ,1 , 2)
Select * from @YourTable for XML RAW('polita')
<polita number="31301879" Trat="1" Frecv="2" />
<polita number="73229903" Type="2" Frecv="2" />
<polita number="73229903" Type="2" Trat="1" Frecv="2" />