Reputation: 37
What i'm trying to do?: generate XML from SQL Server 2014
Problem: some columns contain NULL - these columns act like attributes in my XML. My Validator does not accept an attribute if its value its empty/null.
Example:
number Type Trat Frecv
----------- ----------- ---------- -----------
31301879 NULL 1 2
73229903 2 NULL 2
73229903 2 1 2
Desired result
<polita number="31301879" Trat="1" Frecv="2"></polita>
<polita number="73229903" Type="2" Frecv="2"></polita>
<polita number="73229903" Type="2" Trat="1" Frecv="2"></polita>
!!! Disclaimer: i've read here the method of a variable table, but unfortunately it does not work for me because my columns need to be ATTRIBUTES and i get the duplicate attribute key
It looked like this
declare @t table
(
col1,
col2
)
SELECT
col1,
'' as col1,
col2,
'' as col2
FROM @t
This is my code
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
and @C3
are tables that are declared above, also @pageSize
and @pageNumber
are fixed values.
Upvotes: 2
Views: 1133
Reputation: 81930
Shnugo's was my first answer (+1), but another alternative if you don't want to specify all the fields is to use XML RAW. For example
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')
Returns
<polita number="31301879" Trat="1" Frecv="2" />
<polita number="73229903" Type="2" Frecv="2" />
<polita number="73229903" Type="2" Trat="1" Frecv="2" />
EDIT - Thanks Shnugo for the RAW('polita')
Upvotes: 1
Reputation: 67291
What you need - if I got this right - is the standard behaviour:
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')
--The result
<polita number="31301879" Trat="1" Frecv="2" />
<polita number="73229903" Type="2" Frecv="2" />
<polita number="73229903" Type="2" Trat="1" Frecv="2" />
If you need NULL
s instead of empty strings you can use NULLIF()
.
This answer might help you to understand how XML deals with empty vs. NULL
Upvotes: 1