2017-08-04 94 views
0

有一個問題,並希望有人能幫助我。在@sqlMain中設置的動態sql目前正在抓取一個名爲lg.ColorGroup的列,但實際上我不想抓取該列,但當我刪除它時,雖然我無法執行ORDER BY ColorGroup。有沒有辦法讓結果集返回由ColorGroup排序,而不選擇它。謝謝!動態SQL - 刪除列

INSERT INTO  #ServerList 
SELECT DISTINCT ServerURL, ServerName, InstanceType 
FROM   [CR_PIT_01].[dbo].[EFDM_Servers] 
WHERE   InstanceType = 'Production' 

SELECT   @ProgramList = STUFF((SELECT ',' + QUOTENAME(ServerName) FROM #ServerList ORDER BY ServerURL FOR XML PATH (''), type).value('.', 'nvarchar(max)'), 1, 1, '') 
PRINT   @ProgramList 

CREATE Table #ServerListGrouped 
(
    Name varchar(300), 
    ColorGroup int 
) 

INSERT INTO  #ServerListGrouped 
SELECT DISTINCT Name, (case when SUBSTRING(LOWER(Name), 0, 3) = 'y_' then 2 when SUBSTRING(Lower(Name), 0, 3) = 'z_' then 3 when Exists (Select BuiltInField FROM [CR_PIT_01].[dbo].[EFDM_BuiltInFields] WHERE BuiltInField = Name) then 4 else 1 end) As FieldUsage 
FROM   CR_PIT_01.dbo.EFDM_ProjectFields 
ORDER BY  FieldUsage ASC, Name 

SET    @sqlMain = 'SELECT * FROM (SELECT P.Name, lg.ColorGroup, P.'+ @FilterValue +' , S.ServerName FROM [CR_PIT_01].[dbo].[EFDM_ProjectFields] AS P JOIN #ServerList AS S ON S.ServerURL = P.ServerURL Join #ServerListGrouped LG on p.Name = lg.Name) AS P PIVOT (MIN(' + @FilterValue + ') FOR ServerName IN (' + @ProgramList + ')) AS PIV Where Name LIKE (''%' + @Name + '%'') ORDER BY colorgroup, PIV.Name' 
--SET    @sqlMain = 'SELECT * FROM (SELECT P.Name, P.'+ @FilterValue +' , S.ServerName FROM [CR_PIT_01].[dbo].[EFDM_ProjectFields] AS P JOIN #ServerList AS S ON S.ServerURL = P.ServerURL) AS P PIVOT (MIN(' + @FilterValue + ') FOR ServerName IN (' + @ProgramList + ')) AS PIV Where Name LIKE (''%' + @Name + '%'') ORDER BY PIV.Name;' 
PRINT   @sqlMain; 
--EXEC   sp_executesql @sqlMain; 


DROP TABLE  #ServerList 
DROP TABLE  #ServerListGrouped 

謝謝

+0

我不知道的是,'ORDER BY'在'INSERT ... SELECT'實際上做任何有用的東西。你不一定保證以相同的順序返回它們,它看起來就像你正在加入那個臨時表。訂單沒有意義,所以這一步可以消除。 – Shawn

回答

1

將第一個select子句中的動態sql中的星號更改爲不包含colorgroup的顯式列表。

SET    @sqlMain = 'SELECT * FROM (SELECT P.Name, lg.ColorGroup, P.'+ @FilterValue +' , S.ServerName FROM 

成爲

SET    @sqlMain = 'SELECT Name, '+ @FilterValue +' , ServerName FROM (SELECT P.Name, lg.ColorGroup, P.'+ @FilterValue +' , S.ServerName FROM ... 
+0

謝謝你回答幫助我得出答案。我刪除了你指定的顏色組,並且插入了Name和'@ProgramList'(我相信你的意思),並且它對我很有用。非常感激! – mezzoforte006

1

從外部SELECT列表中刪除顏色組,並把它留在ORDER BY。

不必選擇列用於排序。

它只是意味着你必須指定,而不是使用SELECT *

0

SELECT PIV.Name FROM (...) ORDER BY colorgroup, PIV.Name外選擇列表,是一個有效的SQL。