2

我创建了一个用于填充下拉列表的存储过程。但是 order by 子句不适用于我的程序。

ALTER PROCEDURE proc
    -- Add the parameters for the stored procedure here
    @compID bigint,
    @after datetime
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    CREATE TABLE #tmpAuc ( ProjectID BIGINT, Title VARCHAR(256))
    INSERT INTO #tmpAuc
    SELECT SA.ID ProjectID, SA.Title 
    FROM [dbo].[Sessions] S
        INNER JOIN Auc SA ON S.AucID = SA.ID
    WHERE S.Session < 3 AND SA.Status > 0 AND SA.CompanyID = @companyID AND S.LiveBeginDate > @after
    ORDER BY LiveBeginDate

    SELECT DISTINCT * FROM #tmpAuc
END

我想按 LiveBehinDate 的降序排序

4

2 回答 2

2

包括LiveBeginDate在临时表和临时表结果中ORDER BY LiveBeginDate

CREATE TABLE #tmpAuctions (ProjectID BIGINT, Title VARCHAR(256), LiveBeginDate DATETIME)
INSERT INTO #tmpAuctions (ProjectID, Title, LiveBeginDate)
SELECT SA.ID AS ProjectID, SA.Title, S.LiveBeginDate
FROM [dbo].[Sessions] S
INNER JOIN [Spectrum_Auctions].[dbo].[Auctions] SA ON S.AuctionID = SA.ID
WHERE S.SessionState < 3 AND SA.Status > 0 AND SA.CompanyID = @companyID AND S.LiveBeginDate > @after

SELECT DISTINCT * 
FROM #tmpAuctions
ORDER BY LiveBeginDate

或避免使用临时表并直接在过程中使用带有 JOIN 的 SELECT:

SELECT SA.ID AS ProjectID, SA.Title
FROM [dbo].[Sessions] S
INNER JOIN [Spectrum_Auctions].[dbo].[Auctions] SA ON S.AuctionID = SA.ID
WHERE S.SessionState < 3 AND SA.Status > 0 AND SA.CompanyID = @companyID AND S.LiveBeginDate > @after
ORDER BY S.LiveBeginDate 
于 2019-05-18T07:23:30.047 回答
1

这是因为您的数据在写入位于 temp dB 中的临时表时是有序的。永远不能保证从 temp dB 读取是有序的。因此,当您从临时表中选择星号时,这就是您所得到的。摆脱临时表并直接进行选择。这也将更快、更有效。如果您的 proc 变得更复杂,请使用 CTE 而不是临时表,因为它们更容易概念化并且在所有情况下运行得更快。

于 2019-05-18T07:24:18.807 回答