2017-08-04 146 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。