【问题标题】:Use Dynamic ORDER BY with DISTINCT in sql server在 sql server 中使用带 DISTINCT 的 Dynamic ORDER BY
【发布时间】:2014-08-16 01:01:19
【问题描述】:
DECLARE @OrderBy VARCHAR(100)

SET @OrderBy='DealerCode ASC'

SELECT DISTINCT TOP (10)    
    d.Id, d.DealerCode,d.AffiliationCode,d.LegalName,d.ShipperCode,d.PrimaryUserId,d.PrimaryContactId,d.Zip,              
    d.Address1,d.Address2,d.IsActive,u.IsActive,d.City,d.[State],c.Name,u.UserName,d.RegistrationIntiatedDate,
    d.RegistrationCompletedDate,              
    rs.[Description],u.EntityId,dbo.fnGetCheckHours(d.Id)               
    FROM Dealer d              
    LEFT JOIN [User] u ON d.PrimaryUserId=u.Id              
    LEFT JOIN RegistrationSource rs ON d.RegistrationSourceId=rs.Id              
    LEFT JOIN Country c ON d.CountryId=c.id              
    LEFT JOIN ShippingNote sn ON d.Id=sn.DestinationId              
    LEFT JOIN Yard y ON sn.YardID=y.Code              
    LEFT JOIN Terminal t ON y.TerminalId=t.Id                
    WHERE t.Id='9a77168f-e5b6-4dd0-b26e-f95249c8e189' AND sn.destinationtype='Dealer'
    ORDER BY +'d.'+@OrderBy

但我遇到以下错误:

消息 145,级别 15,状态 1,行 4 如果指定了 SELECT DISTINCT,则 ORDER BY 项必须出现在选择列表中。

我也在使用 CASE 但我再次遇到上述错误

【问题讨论】:

  • 如果您想以这种方式执行此操作,您需要将整个查询包装在一个字符串中并执行该字符串

标签: sql sql-server


【解决方案1】:

您不能在已编译的查询中将顺序设置为变量。您可以尝试像这样构建您的查询

DECLARE @OrderBy VARCHAR(100)

SET @OrderBy='DealerCode'

SELECT DISTINCT TOP (10)    
    d.Id, d.DealerCode,d.AffiliationCode,d.LegalName,d.ShipperCode,d.PrimaryUserId,d.PrimaryContactId,d.Zip,              
    d.Address1,d.Address2,d.IsActive,u.IsActive,d.City,d.[State],c.Name,u.UserName,d.RegistrationIntiatedDate,
    d.RegistrationCompletedDate,              
    rs.[Description],u.EntityId,dbo.fnGetCheckHours(d.Id)               
    FROM Dealer d              
    LEFT JOIN [User] u ON d.PrimaryUserId=u.Id              
    LEFT JOIN RegistrationSource rs ON d.RegistrationSourceId=rs.Id              
    LEFT JOIN Country c ON d.CountryId=c.id              
    LEFT JOIN ShippingNote sn ON d.Id=sn.DestinationId              
    LEFT JOIN Yard y ON sn.YardID=y.Code              
    LEFT JOIN Terminal t ON y.TerminalId=t.Id                
    WHERE t.Id='9a77168f-e5b6-4dd0-b26e-f95249c8e189' AND sn.destinationtype='Dealer'
    ORDER BY  CASE @OrderBy WHEN  'DealerCode' THEN d.DealerCode
                            WHEN  'AffiliationCode' THEN d.AffiliationCode
              END

【讨论】:

  • 我已经使用了 CASES,但我遇到的问题与下面的 Msg 145, Level 15, State 1, Line 5 ORDER BY 项如果指定了 SELECT DISTINCT 必须出现在选择列表中相同。跨度>
【解决方案2】:

尝试使用动态查询

DECLARE @OrderBy VARCHAR(100)
DECLARE @SQL VARCHAR(8000)

SET @OrderBy='DealerCode ASC'

SET @SQL = 'SELECT DISTINCT TOP (10)    
    d.Id, d.DealerCode,d.AffiliationCode,d.LegalName,d.ShipperCode,d.PrimaryUserId,d.PrimaryContactId,d.Zip,              
    d.Address1,d.Address2,d.IsActive,u.IsActive,d.City,d.[State],c.Name,u.UserName,d.RegistrationIntiatedDate,
    d.RegistrationCompletedDate,              
    rs.[Description],u.EntityId,dbo.fnGetCheckHours(d.Id)               
    FROM Dealer d              
    LEFT JOIN [User] u ON d.PrimaryUserId=u.Id              
    LEFT JOIN RegistrationSource rs ON d.RegistrationSourceId=rs.Id              
    LEFT JOIN Country c ON d.CountryId=c.id              
    LEFT JOIN ShippingNote sn ON d.Id=sn.DestinationId              
    LEFT JOIN Yard y ON sn.YardID=y.Code              
    LEFT JOIN Terminal t ON y.TerminalId=t.Id                
    WHERE t.Id=''9a77168f-e5b6-4dd0-b26e-f95249c8e189'' AND sn.destinationtype=''Dealer''
    ORDER BY d.' + @OrderBy

    EXEC(@SQL)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多