Manipuler XMLNamespaces

J'ai la sortie suivante de SQL en utilisant la clause FOR XML :

 <q17:DestinationSection xmlns:q17="http://ITrack.Transmission/2011/02/25/Objects"> <q17:DestinationCode>1</q17:DestinationCode> <q17:DestinationName>Strada Rampei 9, Iasi</q17:DestinationName> <q17:DestinationAddress1>Strada Rampei 9, Iasi</q17:DestinationAddress1> <q17:DestinationAddress2> xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" </q17:DestinationAddress2> </q17:DestinationSection> 

La DestinationSection est la racine principale de ce bloc de données. Est-il possible de faire une solution de contournement et d'avoir quelque chose comme ci-dessous dans la <q17:DestinationAddress2></q17:DestinationAddress2> ?

 <q17:DestinationAddress2 xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"</q17:DestinationAddress2> 

J'ai essayé quelque chose mais j'ai une erreur qui dit que je dois déclarer l'espace de noms mais je ne sais vraiment pas où "introduire" cette définition.

Ma déclaration SQL

 DECLARE @XMLFINAL VARCHAR(MAX) SET @XMLFINAL='' DECLARE @XMLFINAL2 VARCHAR(MAX) SET @XMLFINAL2='' DECLARE @NUMBER NVARCHAR(100) DECLARE @NUMBER2 NVARCHAR(100) DECLARE @XML VARCHAR(MAX) DECLARE @XML2 VARCHAR(MAX) DECLARE Rec CURSOR FAST_FORWARD FOR SELECT GID FROM PurchaseDocumentsHeader OPEN Rec FETCH NEXT FROM Rec INTO @NUMBER2 WHILE @@FETCH_STATUS = 0 BEGIN SET @XML2='' ;WITH XMLNAMESPACES ('http://ITrack.Transmission/2011/02/25/Objects' as q17) SELECT @XML2= ( SELECT DestCode AS 'q17:DestinationCode', DestDescr 'q17:DestinationName', DestAddr AS 'q17:DestinationAddress1', DestAddr2 AS 'q17:DestinationAddress2', DestZIP AS 'q17:DestinationZIP' FROM PurchaseDocumentsHeader WHERE GID=@NUMBER2 FOR XML RAW('q17:DestinationSection'),ELEMENTS ) FETCH NEXT FROM Rec INTO @NUMBER2 SET @XMLFINAL2=@XMLFINAL2+@XML2 END CLOSE Rec DEALLOCATE Rec 

MODIFIER

Veuillez find ci-dessous mon DDL. C'est une vue utilisée pour extraire datatables d'une table officielle.

 CREATE VIEW [dbo].[PurchaseDocumentsHeader] AS SELECT esd.GID, esd.ADRegistrationDate, esgo.Code AS DestCode, esgo.Description AS DestDescr, esgo.Address1 AS DestAddr, esgo.fCityCode AS DestCity, esgp.TaxRegistrationNumber AS DestZIP, 'xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' AS DestAddr2, esgo.Description AS DestRomanized, esgo.Address1 AS DestAddress1Romanized, 'xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' AS DestAddress2Romanized, esgp.TaxRegistrationNumber AS DestZIPRom, esgo.fCityCode AS DestCityRomanized, esgo.fCountryCode AS DestCountry, cast('DestinationGLN xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>' AS XML) AS DestGLN, 'xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"' AS DestCoord FROM ESFIDocumentTrade esd LEFT JOIN ESGOSites esgo on esd.fDeliverySiteGID=esgo.GID LEFT JOIN ESFITradeAccount esc on esd.fTradeAccountGID=esc.GID LEFT JOIN ESGOPerson esgp on esc.fPersonCodeGID=esgo.GID LEFT JOIN ESFIDocumentType est on esd.fADDocumentTypeGID=est.GID WHERE esd.fTransitionStepCode='APPROVED' AND est.Code='CVR' AND YEAR(esd.ADRegistrationDate)=YEAR(GETDATE()) AND MONTH(esd.ADRegistrationDate)=MONTH(GETDATE()) AND DAY(esd.ADRegistrationDate)=DAY(GETDATE()) GO 

Modification ultérieure

 CREATE TABLE DocPurcharseHeader ( ADRegistrationDate date, Code NVARCHAR(4000), Description NVARCHAR(4000), Address1 NVARCHAR (4000), Address2 NVARCHAR (4000), City NVARCHAR (4000), ZIPCode NVARCHAR(4000) ) INSERT INTO DocPurcharseHeader (ADRegistrationDate, Code, Description, Address1, Address2, City, ZIPCode) VALUES('2017-10-16', '01', 'MyPOS', 'MyPOSAddress1', 'MyPOSAddress2', 'BUCHAREST', '123456') 

2e édition ultérieure

 ;WITH XMLNAMESPACES ('http://ITrack.Transmission/2011/02/25/Objects' as q17) SELECT @XMLSalesOrders=( SELECT DestCode AS [q17:DestinationCode] ,DestDescr AS [q17:DestinationName] ,DestAddr AS [q17:DestinationAddress1] ,DestAddr2 AS [q17:DestinationAddress2] FROM PurchaseDocumentsHeader FOR XML PATH('q17:DestinationSection'),ELEMENTS XSINIL,ROOT('q17:DestinationSections')) 

Ce code ci-dessus génère la sortie ci-dessous, sans la directive XSINL :

 <q17:DestinationSections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:q17="http://ITrack.Transmission/2011/02/25/Objects"> <q17:DestinationSection> <q17:DestinationCode>1</q17:DestinationCode> <q17:DestinationName>Strada Rampei 9, Iasi</q17:DestinationName> <q17:DestinationAddress1>Strada Rampei 9, Iasi</q17:DestinationAddress1> <q17:DestinationAddress2/> </q17:DestinationSection> <q17:DestinationSection> 

vous essayez de surpasser le très puissant moteur XML.

Comme indiqué dans votre autre question:

Ne faites jamais cela dans un CURSOR ! Ils sont mauvais et mauvais, venant directement de l'enfer de la pensée procédurale et ont été inventés par le diable du code spaghetti …

Essayez-le comme ceci:

J'utilise votre table DDL pour insert des données. La deuxième ligne aura une NULL dans l'adresse 2. Normalement, XML omettra simplement les valeurs NULL. Un noeud non existant est lu comme une valeur NULL . Mais vous pouvez forcer NULL à être introduit comme xsi.nil="true" avec ELEMENTS XSINIL :

 CREATE TABLE DocPurcharseHeader ( ADRegistrationDate date, Code NVARCHAR(4000), Description NVARCHAR(4000), Address1 NVARCHAR (4000), Address2 NVARCHAR (4000), City NVARCHAR (4000), ZIPCode NVARCHAR(4000) ); INSERT INTO DocPurcharseHeader (ADRegistrationDate, Code, Description, Address1, Address2, City, ZIPCode) VALUES('2017-10-16', '01', 'MyPOS', 'MyPOSAddress1', 'MyPOSAddress2', 'BUCHAREST', '123456') ,('2017-10-16', '01', 'MyPOS', 'MyPOSAddress1', NULL, 'BUCHAREST', '123456'); WITH XMLNAMESPACES('http://ITrack.Transmission/2011/02/25/Objects' AS q17) SELECT Code AS [q17:DestinationCode] ,Description AS [q17:DestinationName] ,Address1 AS [q17:DestinationAddress1] ,Address2 AS [q17:DestinationAddress2] FROM DocPurcharseHeader FOR XML PATH('q17:DestinationSection'),ELEMENTS XSINIL,ROOT('q17:DestinationSections'); 

Le résultat

 <q17:DestinationSections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:q17="http://ITrack.Transmission/2011/02/25/Objects"> <q17:DestinationSection> <q17:DestinationCode>01</q17:DestinationCode> <q17:DestinationName>MyPOS</q17:DestinationName> <q17:DestinationAddress1>MyPOSAddress1</q17:DestinationAddress1> <q17:DestinationAddress2>MyPOSAddress2</q17:DestinationAddress2> </q17:DestinationSection> <q17:DestinationSection> <q17:DestinationCode>01</q17:DestinationCode> <q17:DestinationName>MyPOS</q17:DestinationName> <q17:DestinationAddress1>MyPOSAddress1</q17:DestinationAddress1> <q17:DestinationAddress2 xsi:nil="true" /> </q17:DestinationSection> </q17:DestinationSections> 

UPDATE: A propos des valeurs NULL :

Essaye ça

 DECLARE @DummyTable TABLE(SomeDescription VARCHAR(500), SomeValue VARCHAR(100)); INSERT INTO @DummyTable VALUES('A real NULL value',NULL) ,('An empty ssortingng','') ,('A blank ssortingng',' ') ,('Some Text','blah blah'); WITH XMLNAMESPACES('SomeURL' AS q17) SELECT SomeDescription AS [q17:Description] ,SomeValue AS [q17:Value] FROM @DummyTable FOR XML PATH('q17:row'),ELEMENTS XSINIL,ROOT('root'); 

Pour get ceci

 <root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:q17="SomeURL"> <q17:row> <q17:Description>A real NULL value</q17:Description> <q17:Value xsi:nil="true" /> </q17:row> <q17:row> <q17:Description>An empty ssortingng</q17:Description> <q17:Value></q17:Value> </q17:row> <q17:row> <q17:Description>A blank ssortingng</q17:Description> <q17:Value> </q17:Value> </q17:row> <q17:row> <q17:Description>Some Text</q17:Description> <q17:Value>blah blah</q17:Value> </q17:row> </root> 

Vous pouvez voir que le NULL réel est codé comme xsi:nil="true" , alors que la string vide est affichée comme <q17:Value></q17:Value> (qui est exactement la même chose que <q17:Value /> ).

Cochez cette réponse pour quelques exemples sur NULL et empty . Cochez cette réponse pour en savoir plus sur le text()