【问题标题】:XML element value with width limitation具有宽度限制的 XML 元素值
【发布时间】:2017-10-17 18:30:06
【问题描述】:

我是 XML 新手,正在尝试使用客户表在 SQL Server 2008 中解决以下问题。

NAME 列具有固定宽度,因此需要将值(客户名称)分成多个表示形式。

请看:

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

知道如何解决这个问题吗?

谢谢, 安妮

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

【问题讨论】:

    标签: sql xml sql-server-2008 tsql for-xml-path


    【解决方案1】:

    这个设计很糟糕。如果你有一点机会改变这一点,你应该......

    如果你必须坚持这个,你可以这样尝试:

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

    --您可以设置切片的长度。 TOP(20) 是硬编码的,并设置了部件数的上限。

    DECLARE @PartLenght INT=20;
    

    --查询会得到一个数字的表(tally tableon-the-fly然后使用FOR XML PATH()创建你需要的嵌套的XML .

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

    结果

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

    【讨论】:

    • 非常感谢 Shnugo,这是非常优雅的代码,拯救了我的一天!
    • 只是听从了您的建议。这是正确的礼仪。
    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    相关资源
    最近更新 更多