【问题标题】:SQL Server 2012 ORDER BY works differently?SQL Server 2012 ORDER BY 的工作方式不同?
【发布时间】:2013-09-18 07:44:01
【问题描述】:

我多年来在 SQL Server 2005 中使用以下代码,最近升级到 SQL Server 2012,它似乎破坏了ORDER BY 子句。代码应该是这样显示的:

A
A1
B
B1
B2
B3
C

但是将所有相同类型的行组合在一起。任何想法为什么?

DECLARE @PeriodStart DATETIME 
DECLARE @PeriodEnd DATETIME 

SELECT @PeriodEnd = Getdate(), 
       @PeriodStart = Dateadd(hour, -96, Getdate()); 

WITH outpq 
     AS (SELECT 1                                          AS grpOrd, 
                Cast(NULL AS VARCHAR(255))                 AS posInGrp, 
                'A'                                        AS Ord, 
                casenumberkey, 
                'A|' + clientskey + '|' 
                + Cast(brtnumber AS VARCHAR(11)) + '|' 
                + Isnull(Replace(CONVERT(CHAR(10), coverdate, 101), '/', ''), '' 
                ) 
                + '|' 
                + Isnull(Replace(CONVERT(CHAR(10), coverdate, 101), '/', ''), '' 
                ) 
                + '|' + Isnull(parcelnumber, '') + '|' 
                + Isnull(assessedbeg, '') + '|' 
                + Isnull(assesseddim, '') + '|' 
                + Isnull(abbrlegal, '') + '|' 
                + Isnull(waterfrom, '') + '|' 
                + Isnull(waterto, '') + '|' 
                + Isnull(Cast(wateropen AS VARCHAR(50)), '') 
                + '|' + Isnull(taxfrom, '') + '|' + Isnull(taxto, '') 
                + '|' 
                + Isnull(Cast(taxopen AS VARCHAR(50)), '') AS Extract 
         FROM   newcitycollection.dbo.propertyinformation 
         WHERE  datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
         UNION ALL 
         SELECT 1                                AS grpOrd, 
                NULL                             AS posInGrp, 
                'A1', 
                A.casenumberkey, 
                'A1|' + '|' + '|' + B.liennumber + '|' 
                + Isnull(Cast(B.lienamt AS VARCHAR(50)), '') 
                + '|' + Isnull(Replace(liendate, '/', ''), '') 
                + '|' + Isnull(B.lienreason, '') AS Extract 
         FROM   newcitycollection.dbo.propertyinformation A 
                JOIN newcitycollection.dbo.muniliens B 
                  ON B.casenumberkey = A.casenumberkey 
         WHERE  A.datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
         UNION ALL 
         SELECT 2                                     AS grpOrd, 
                Cast(C.interestskey AS VARCHAR(11))   AS posInGrp, 
                'B', 
                A.casenumberkey, 
                'B|' + '|' + Isnull(C.first, '') + '|' 
                + Isnull(C.middle, '') + '|' + Isnull(C.last, '') 
                + '|' + Isnull(C.alias, '') + '|' 
                + Isnull(C.comname, '') + '|' 
                + Isnull(C.docrel, '') + '|' 
                + Cast(C.interestskey AS VARCHAR(11)) AS Extract 
         FROM   newcitycollection.dbo.propertyinformation A 
                JOIN newcitycollection.dbo.interests C 
                  ON C.casenumberkey = A.casenumberkey 
         WHERE  A.datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
         UNION ALL 
         SELECT 2                                   AS grpOrd, 
                Cast(C.interestskey AS VARCHAR(11)) AS posInGrp, 
                'B1', 
                A.casenumberkey, 
                'B1|' + Isnull(fulladd, '') + '|' 
                + Isnull(D.city, '') + '|' + Isnull(D.state, '') 
                + '|' + Isnull(D.zip, '')           AS Extract 
         FROM   newcitycollection.dbo.propertyinformation A 
                JOIN newcitycollection.dbo.interests C 
                  ON C.casenumberkey = A.casenumberkey 
                JOIN newcitycollection.dbo.interestadd D 
                  ON D.casenumberkey = A.casenumberkey 
                     AND D.interestskey = C.interestskey 
         WHERE  A.datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
         UNION ALL 
         SELECT 2                                                AS grpOrd, 
                Cast(C.interestskey AS VARCHAR(11))              AS posInGrp, 
                'B2', 
                A.casenumberkey, 
                'B2|' + '|' + Isnull(E.suitnumber, '') + '|' 
                + Cast(E.bdate AS VARCHAR(11)) + '|' 
                + Isnull(E.chapter, '') + '|' + Isnull(E.vs, '') AS Extract 
         FROM   newcitycollection.dbo.propertyinformation A 
                JOIN newcitycollection.dbo.interests C 
                  ON C.casenumberkey = A.casenumberkey 
                JOIN newcitycollection.dbo.banks E 
                  ON E.casenumberkey = A.casenumberkey 
                     AND E.interestskey = C.interestskey 
         WHERE  A.datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
         UNION ALL 
         SELECT 3                                 AS grpOrd3, 
                NULL                              AS posInGrp, 
                'B3', 
                A.casenumberkey, 
                'B3|' + '|' + F.doctype + '|' 
                + Isnull(Cast(F.docamt AS VARCHAR(50)), '') 
                + '|' 
                + Isnull(Replace(CONVERT(CHAR(10), docdate, 101), '/', ''), '') 
                + '|' 
                + Isnull(Replace(CONVERT(CHAR(10), recdate, 101), '/', ''), '') 
                + '|' + Isnull(F.docid, '') + '|' 
                + Isnull(F.grantee, '') + '|' 
                + Isnull(F.grantor, '') 
                + Cast(F.docidkey AS VARCHAR(11)) AS Extract 
         FROM   newcitycollection.dbo.propertyinformation A 
                JOIN newcitycollection.dbo.documents F 
                  ON F.casenumberkey = A.casenumberkey 
         WHERE  A.datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
         UNION ALL 
         SELECT 4 
                AS grpOrd 
                , 
                NULL 
                AS posInGrp, 
                'C', 
                A.casenumberkey, 
                'C|' + Isnull(J.ctype, '') + '|' 
                + Isnull(J.plaintiffname, '') + '|' 
                + Isnull(J.plaintiffadd1, '') + '|' 
                + Isnull(J.plaintiffcity, '') + '|' 
                + Isnull(J.plaintiffstate, '') + '|' 
                + Isnull(J.plaintiffzip, '') + '|' + '|' 
                + Isnull(J.defendantname, '') + '|' 
                + Isnull(J.defendantadd1, '') + '|' 
                + Isnull(J.defcity, '') + '|' 
                + Isnull(J.defstate, '') + '|' 
                + Isnull(J.defzip, '') + '|' + '|' 
                + Isnull(J.court, '') + '|' + Isnull(J.caseid, '') 
                + '|' + Isnull(J.jamt, '') + '|' 
                + Isnull(Replace(CONVERT(VARCHAR(10), jdate, 101), '/', ''), '') 
                + '|' 
                + Isnull(Replace(CONVERT(VARCHAR(10), reviveddate, 101), '/', '' 
                ), '' 
                ) 
                AS 
                Extract 
         FROM   newcitycollection.dbo.propertyinformation A 
                JOIN acme.new_judgment_system.dbo.selected_compiled_clean J 
                  ON J.casenumber = A.casenumberkey 
         WHERE  A.datefinished BETWEEN @PeriodStart AND @PeriodEnd 
                AND clientkey = 2 
                AND J.plaintiffname NOT IN (SELECT plaintiff 
                                            FROM 
                    newcitycollection.dbo.excluded_plaintiffs)) 
--Extract data set into a table -- dump table in .txt with current date as part of name then delete that table 
SELECT extract 
INTO   datadump 
FROM   outpq 
ORDER  BY casenumberkey, 
          grpord, 
          posingrp, 
          ord 

DECLARE @FileName   VARCHAR(50), 
        @bcpCommand VARCHAR(2000) 

SET @FileName = Replace('D:\LDExport\Argosy_import_' 
                        + CONVERT(CHAR(8), Getdate(), 1) + '_0001.txt', '/', '') 
SET @bcpCommand = 'bcp "SELECT Extract FROM datadump" QUERYOUT "' 
SET @bcpCommand = @bcpCommand + @FileName 
                  + '" -U sa -P $%^&*() -T -c' 

EXEC master..Xp_cmdshell 
  @bcpCommand 

DROP TABLE datadump 

【问题讨论】:

    标签: sql sql-server-2012 bcp


    【解决方案1】:

    您的最终查询...

    SELECT Extract FROM datadump
    

    ...没有ORDER BY。你期待什么?

    在此处添加ORDER BY。插入时所订购的内容与以后的查询无关。

    【讨论】:

    • 而 2012 年更改的原因是在以前的版本中,它会尊重插入时的 ORDER BY,以防与 SET ROWCOUNT N 一起运行,但现在它为这种情况编译了不同的计划。
    • 它确实有一个 orderby:SELECT Extract INTO datadump FROM outpQ ORDER BY CaseNumberKey, grpOrd, posInGrp, Ord
    • @korrowan - 插入行的顺序并不能保证它们将从SELECT 返回的顺序。在 2012 年,它们甚至没有按该顺序插入。它被优化了。
    • 那我该如何解决呢?你上面提到的我在哪里下订单?
    • @korrowan - 您可以在SELECT ... INTO 中添加另一列ROW_NUMBER() OVER (ORDER BY ...),然后使用SELECT Extract FROM datadump ORDER BY RN
    猜你喜欢
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2022-07-04
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多