2017-06-07 193 views
0

大家好,我還是比較新的SQL,並且在線搜索還沒有提供給我一個解決方案(或者它在我面前,但離開我的知識領域:/) 。所以希望在這裏試試我的運氣謝謝!使用Pivot SQL的動態列名稱

Table: Servers 
Columns: ServerUrl    ServerName 
Rows: //server0001/space0/ Telescope1 
     //server0001/space1/ Space 
     //server0001/space2/ Planet 

Table: Projects 
Columns: ServerUrl    Name   Entity  Type 
Rows: //server0001/space0/ Field1  E   T1 
     //server0001/space1/ Field2  T   T1 
     //server0001/space2/ Field3  E   T3 

隨着存儲過程下面我能夠將數據作爲返回:

所以SERVERURL被用作如下所示的列名,但我希望它是在服務器名稱代替。我知道有可能將列設置爲ServerNames,但是我將如何動態進行此操作,因爲ServerUrl可能會更改。

--- Returned Data Begin --- 
Stored Procedure Results: 
Columns: Name Entity //server0001/space0/ ...space1 ...space2 
Rows: Field1 E  T1      NULL  NULL 
     Field2 T  NULL     T2   NULL 
     Field3 E  NULL     NULL  T3  

--- Returned Data End --- 

***存儲過程下用於獲得上述結果

--- STORED PROCEDURE BEGIN --- 
DECLARE @Projects varchar(max) 
SELECT @ProgramList = COALESCE(@Projects + '], [', '') + ServerURL FROM 
Servers ORDER BY ServerURL 

SET @ProgramList = CONCAT ('[', @ProgramList + ']') 

DECLARE @sql nvarchar(max) 
SET @sql = 'select * from (select P.Name, P.Entity, P.Field, P.ServerUrl 
FROM ProjectFields as P) as P pivot (min(P.Field) for P.ServerUrl in (' + 
@Projects + ')) as PIV ORDER BY Name' 

EXEC sp_executesql @sql1 
--- STORED PROCEDURE END --- 

謝謝:)

+0

將@ProgramList選擇更改爲ServerName inste並將您的動態語句更改爲「SELECT * FROM(SELECT P.Name,P.Entity,P.Field,S.ServerName FROM ProjectFields AS P JOIN Servers AS S S.ServerURL = P. ServerURL)AS P PIVOT(MIN(Field)FOR ServerName IN('+ @ProgramList +'))作爲PIV ORDER BY PIV.Name;'' – ZLK

回答

0

你的存儲過程看起來是不完整的,或者你已經改變了一些事情,但我相信你正在尋找類似如下的東西:

DECLARE @ProgramList VARCHAR(MAX); 
SELECT @ProgramList = STUFF((SELECT ',' + QUOTENAME(ServerName) FROM [Servers] ORDER BY ServerURL FOR XML PATH ('')), 1, 1, ''); 

DECLARE @sql VARCHAR(MAX); 
SELECT @sql = ' 
SELECT * 
FROM 
(
    SELECT P.Name, 
      P.Entity, 
      P.Field, 
      S.ServerName 
    FROM ProjectFields AS P 
    JOIN [Servers] AS S 
     ON S.ServerURL = P.ServerURL 
) AS P 
PIVOT 
(
    MIN(Field) FOR ServerName IN (' + @ProgramList + ') 
) AS PIV 
ORDER BY PIV.Name;'; 

--PRINT @sql; 
EXEC sp_executesql @sql; 
+0

非常感謝ZLK,作品像一個魅力,是的你是對的我改變了一些事情對不起。 – mezzoforte006