2017-05-18 6 views
1

Je suis novice en matière de XML et je tente de résoudre les problèmes suivants dans SQL Server 2008 à l'aide de la table customer. La colonne a une largeur fixe, donc la valeur (nom du client) doit être séparée en plus d'une représentation.Valeur d'élément XML avec limitation de la largeur

S'il vous plaît voir:

  • NAME index="1" ....
  • NAME index="2" ....

Toute idée comment aborder ce sujet?

Merci, Anne

<PARTNER> 
    <NAME index="1">XEXSY SMALL REALTY LLC</NAME> 
    <NAME index="2">AA/NAX TEEEENERGY</NAME> 
    <PARTNRTYPE>703884</PARTNRTYPE> 
    <ADDRESS> 
     <ADDRLINE index="1">544 PACIFIC BLVD</ADDRLINE> 
     <CITY>LONG BEACH</CITY> 
     <COUNTRY>US</COUNTRY> 
     <POSTALCODE>07740</POSTALCODE> 
    </ADDRESS> 
</PARTNER> 

Répondre

0

Cette conception est awfull. Si vous avez la moindre chance de changer cela, vous devriez ...

Si vous devez en tenir à cela, vous pouvez l'essayer comme ceci:

DECLARE @mockup TABLE(Name VARCHAR(100),PartnerType INT,Addr VARCHAR(100),City VARCHAR(100)); 
INSERT INTO @mockup VALUES 
('This is a very long name which needs to be splitted in smaller parts' 
    ,12345 
    ,'And this address is very long too, the person has a really long address...' 
    ,'Washington') 
,('ShortName' 
    ,12345 
    ,'ShortAddress' 
    ,'New York'); 

--Vous peut régler la longueur de les tranches . Le TOP(20) est codé en dur et définit une limite supérieure au nombre de parties.

DECLARE @PartLenght INT=20; 

--Le requête se sur la volée puis utilisez FOR XML PATH() pour créer le XML une table de numéro (tableau de pointage) avec les imbrications dont vous avez besoin.

WITH Tally AS 
(
    SELECT TOP(20) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS Nr 
    FROM master..spt_values 
) 
SELECT (
     SELECT Nr AS [NAME/@index] 
       ,SUBSTRING(m.Name,Nr+((Nr-1) * (@PartLenght-1)),@PartLenght) AS [NAME] 
     FROM Tally 
     WHERE LEN(SUBSTRING(m.Name,Nr+((Nr-1) * (@PartLenght-1)),@PartLenght))>0 
     FOR XML PATH(''),TYPE 
     ) 
     ,m.PartnerType AS [PARTNERTYPE] 
     ,(
      SELECT  
      (
      SELECT Nr AS [ADDRLINE/@index] 
        ,SUBSTRING(m.Addr,Nr+((Nr-1) * (@PartLenght-1)),@PartLenght) AS [ADDRLINE] 
      FROM Tally 
      WHERE LEN(SUBSTRING(m.Addr,Nr+((Nr-1) * (@PartLenght-1)),@PartLenght))>0 
      FOR XML PATH(''),TYPE 
     ) 
     ,City AS [CITY] 
     FOR XML PATH('ADDRESS'),TYPE 
    ) 
FROM @mockup AS m 
FOR XML PATH('PARTNER') 

Le résultat

<PARTNER> 
    <NAME index="1">This is a very long </NAME> 
    <NAME index="2">name which needs to </NAME> 
    <NAME index="3">be splitted in small</NAME> 
    <NAME index="4">er parts</NAME> 
    <PARTNERTYPE>12345</PARTNERTYPE> 
    <ADDRESS> 
    <ADDRLINE index="1">And this address is </ADDRLINE> 
    <ADDRLINE index="2">very long too, the p</ADDRLINE> 
    <ADDRLINE index="3">erson has a really l</ADDRLINE> 
    <ADDRLINE index="4">ong address...</ADDRLINE> 
    <CITY>Washington</CITY> 
    </ADDRESS> 
</PARTNER> 
<PARTNER> 
    <NAME index="1">ShortName</NAME> 
    <PARTNERTYPE>12345</PARTNERTYPE> 
    <ADDRESS> 
    <ADDRLINE index="1">ShortAddress</ADDRLINE> 
    <CITY>New York</CITY> 
    </ADDRESS> 
</PARTNER> 
+0

Merci beaucoup Shnugo, ce code est très élégant et sauver ma journée! –

+0

vient de suivre votre conseil. C'est l'étiquette appropriée. –