Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

फ़ॉर्मेट किए गए HTML के रूप में रिटर्न सिलेक्ट स्टेटमेंट

एचटीएमएल को मैन्युअल रूप से तैयार करने का एक बहुत ही बदसूरत तरीका यहां दिया गया है। एक अच्छा कारण है कि यह SQL सर्वर में नहीं है। मुझे यकीन है कि कुछ एक्सएमएल गुरु साथ आएंगे और मुझे और अधिक सीधी विधि से शर्मिंदा करेंगे (मैंने साइमन सबिन का समाधान लेकिन आपकी आवश्यकता के अनुसार इसका अनुवाद नहीं कर सका), लेकिन अभी के लिए:

DECLARE @x TABLE(Gender VARCHAR(6), Age INT, Name VARCHAR(32));

INSERT @x VALUES  ('Male',   30, 'Bill'),  ('Female', 27, 'Jenny'),
                  ('Female', 27, 'Debby'), ('Male',   44, 'Frank');

DECLARE @html NVARCHAR(MAX) = N'';

;WITH x AS ( SELECT x.Age, x.Gender, x.Name,
    dr = DENSE_RANK() OVER (PARTITION BY x.Gender ORDER BY x.Age),
    gn = ROW_NUMBER() OVER (PARTITION BY x.Gender ORDER BY x.Age),
    rn = ROW_NUMBER() OVER (ORDER BY x.Gender DESC, x.Age)
  FROM @x AS x ) SELECT @html +=
    CHAR(13) + CHAR(10) + CASE WHEN c1.gn = 1 THEN 
        CASE WHEN c1.rn > 1 THEN '</li></ul></li></ul>' ELSE '' END + '<ul><li>' 
        + c1.Gender ELSE '' END + CHAR(13) + CHAR(10) + CHAR(9) 
        + CASE WHEN c1.gn = 1 OR c1.Age <> c3.Age THEN 
        CASE WHEN c1.gn > 1 THEN '</li>' ELSE '<ul>' END + '<li>' 
        + CONVERT(VARCHAR(32), c1.Age) ELSE '' END + CHAR(13) + CHAR(10) + CHAR(9) 
        + CHAR(9) + CASE WHEN (c1.gn = 1 OR c1.Age <> c3.Age) THEN '<ul>' ELSE '' END 
        + '<li>' + c1.Name + '</li>' + CASE WHEN c1.Age <> c2.Age OR c1.dr <> c2.dr 
        THEN '</ul>' ELSE '' END
FROM x AS c1 
LEFT OUTER JOIN x AS c2
ON c1.rn = c2.rn - 1
LEFT OUTER JOIN x AS c3
ON c1.rn = c3.rn + 1
ORDER BY c1.Gender DESC, c1.Age;

SELECT @html += '</ul></li></ul></li></ul>';

PRINT @html; -- note you will need to deal with this 
             -- in another way if the string is large

परिणाम - ठीक वैसा नहीं जैसा आपने व्हाइट स्पेस के संदर्भ में मांगा था, लेकिन समान HTML रेंडरिंग:

<ul><li>Male
    <ul><li>30
        <ul><li>Bill</li></ul>

    </li><li>44
        <ul><li>Frank</li></ul>
</li></ul></li></ul><ul><li>Female
    <ul><li>27
        <ul><li>Jenny</li>


        <li>Debby</li></ul></li></ul></li></ul>

संपादित करें अधिक साफ-सुथरे समाधान के लिए, साथ ही साथ बहुत सारे नाटक और एक अच्छा प्रदर्शन क्यों @ZeeTee StackOverflow पर सबसे अधिक परेशान करने वाला उपयोगकर्ता है, फॉलो-अप प्रश्न के लिए Mikael का समाधान देखें:

फॉर्मेट किए गए HTML के रूप में रिटर्न सिलेक्ट स्टेटमेंट (SQL) 2005)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL सर्वर 2014 CTP1 में विभाजन-स्तर ऑनलाइन अनुक्रमणिका संचालन की खोज करना

  2. SQL सर्वर में अलर्ट और ऑपरेटरों का उपयोग करना

  3. क्रॉस जॉइन बिहेवियर (SQLServer 2008)

  4. MIN एग्रीगेट फ़ंक्शन को BIT फ़ील्ड में लागू करना

  5. सभी डुप्लीकेट पंक्तियां दिखाएं