2017-05-18 3 views
1

Ich bin neu in XML und versuche, das Folgende in SQL Server 2008 mithilfe der Kundentabelle zu lösen.XML-Elementwert mit Weitenbegrenzung

NAME Spalte hat feste Breite, daher muss der Wert (Kundenname) in mehr als eine Darstellung aufgeteilt werden.

Bitte sehen:

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

Jede Idee, wie dies in Angriff zu nehmen?

Danke, 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> 

Antwort

0

Dieser Entwurf awfull wird. Wenn Sie auf die geringste Chance haben, dies zu ändern, sollten Sie ...

Wenn Sie mit diesem halten haben, können Sie es so versuchen:

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'); 

--Sie die Länge einstellen kann die Scheiben. Der TOP(20) ist fest codiert und legt eine Obergrenze für die Anzahl der Teile fest.

DECLARE @PartLenght INT=20; 

--Die Abfrage wird eine Reihe der Tabelle (tally Tabelle) on-the-fly bekommen und FOR XML PATH() dann mit den Verschachtelungen die XML zu erstellen verwenden Sie benötigen.

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') 

Das Ergebnis

<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

Sie so viel Shnugo Danke, das ist sehr elegant Code und mein Tag retten! –

+0

folgte nur Ihrem Rat. Das ist die richtige Etikette. –