2017-07-07 92 views
1

我喜歡以下面的方式獲取SQL Server查詢輸出。目前,我的輸出是:格式化SQL Server查詢輸出

Class | Student ID | Student Name 
------+------------+--------------- 
121  S1   Test 1 
121  S2   Test 2 
500  S22   Test a 
500  S23   Test b 

但我想通過以下方式進行數據輸出 -

Class: 121 
-------------------------------- 

Student ID | Student Name 
-----------+--------------- 
S1   Test 1 
S2   Test 2 

Class: 500 
-------------------------------- 

Student ID | Student Name 
-----------+--------------- 
S22   Test a 
S23   Test b 

有人能幫助我我怎麼能做到這些?

感謝

+0

據我所知,用SQL只能達到這個確切的結果。返回後,您是否將這些數據發送給像SSRS這樣的應用程序?這在SSRS中很簡單。 – McGlothlin

+0

@McGlothlin,我沒有發送到SSRS,我將使用此查詢到我的asp.net項目 –

+0

您不會在SQL Server中配置此輸出。這將不得不在你的asp.net項目中進行配置。 –

回答

0

雖然我同意SQL是不是做你的格式化的地方....有時你卡住....

本準則

select '121' as Class,  'S1 ' as [Student ID],  'Test 1' as [Student Name] into #test 
union select '121', 'S2 ', 'Test 2' 
union select '500', 'S22 ', 'Test a' 
union select '500', 'S23 ', 'Test b' 

; 
WITH class 
AS (
    SELECT DISTINCT class 
    FROM #test 
    ) 
    ,student 
AS (
    SELECT class 
     ,(
      SELECT STUFF((
         SELECT CHAR(13) + t.[Student ID] + space(len('Student ID | ') - len(t.[Student ID])) + [Student Name] 
         FROM #Test t 
         WHERE t.[class] = class.[class] 
         FOR XML PATH('') 
          ,type 
         ).value('.[1]', 'nvarchar(max)'), 1, 1, '') 
      ) AS info 
    FROM class 
    ) 
    ,theoutput 
AS (
    SELECT 'Class: ' + class + CHAR(13) + '------------------------' + CHAR(13) + 'Student ID | Student Name' + CHAR(13) + info + CHAR(13) + CHAR(13) AS txt 
    FROM student c 
    ) 
SELECT STUFF((
      SELECT CHAR(13) + txt 
      FROM theoutput 
      FOR XML PATH('') 
       ,type 
      ).value('.[1]', 'nvarchar(max)'), 1, 1, '') 

方能產生

Class: 121 
------------------------ 
Student ID | Student Name 
S1   Test 1 
S2   Test 2 


Class: 500 
------------------------ 
Student ID | Student Name 
S22   Test a 
S23   Test b 
+0

非常感謝周杰倫的幫助,謝謝 –

0

通過使用While循環我們可以得到期望的結果創建的樣本數據

IF OBJECT_ID('Tempdb..#TEMP') IS NOT NULL 
Drop table #TEMP 
;With cte(Class, StudentID, StudentName) 
AS 
(
SELECT 121,'S1' ,'Test 1' UNION ALL 
SELECT 121,'S2' ,'Test 2' UNION ALL 
SELECT 500,'S22','Test a' UNION ALL 
SELECT 500,'S23','Test b' 
)    
SELECT * INTO #TEMP FROM CTe 

SET NOCOUNT ON 
DECLARE @CLassCOUnt INT 
    ,@minID INT 
    ,@maxid INT 
    ,@Sql NVARCHAR(max) 
    ,@SelectQuery INT 
DECLARE @Table TABLE (
    ID INT IDENTITY 
    ,CLass INT 
    ) 

INSERT INTO @Table (CLass) 
SELECT DISTINCT Class 
FROM #TEMP 

SELECT @minID = min(Id) 
FROM @Table 

SELECT @maxid = MAX(Id) 
FROM @Table 

WHILE (@minID <= @maxid) 
BEGIN 
    SELECT @SelectQuery = Class 
    FROM @Table 
    WHERE ID = @minID 

    SELECT @Sql = 'SELECT Class, StudentID, StudentName FROM #TEMP WHERE Class=' + CAST(@SelectQuery AS VARCHAR) 


    PRINT 'Result Of Class:'+ CAST(@SelectQuery AS VARCHAR)+CHAR(13)+CHAR(10)+'------------------------' 
    PRINT @Sql 
    EXEC (@Sql) 

    SET @minID = @minID + 1 
END 

SET NOCOUNT OFF