Sql server 插入到..按顺序选择

Sql server 插入到..按顺序选择,sql-server,tsql,ssis,sql-order-by,dynamics-ax-2012,Sql Server,Tsql,Ssis,Sql Order By,Dynamics Ax 2012,我在从另一个表按特定顺序将数据插入表时遇到问题。我需要按列排序的数据Niveau 我的问题是: IF OBJECT_ID('tempdb..#DISPLAYVALUEALL') IS NOT NULL DROP TABLE #DISPLAYVALUEALL SELECT Ecritures.RecIdLine AS RecIdLine, Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb, Level

我在从另一个表按特定顺序将数据插入表时遇到问题。我需要按列排序的数据
Niveau

我的问题是:

IF OBJECT_ID('tempdb..#DISPLAYVALUEALL') IS NOT NULL
        DROP TABLE #DISPLAYVALUEALL

SELECT  
    Ecritures.RecIdLine    AS RecIdLine, 
    Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb,
    LevelTable.DIMENSIONATTRIBUTE   AS DimAttribute,
    LevelTable.LEVEL_          AS Niveau,
    DimAttr.Name               AS Dim_Label
INTO 
    #DISPLAYVALUEALL
FROM 
    #BudgetTransTmp     As Ecritures            
INNER JOIN 
    #InterfacesParmTmp  AS Tmp1 ON Tmp1.DATAAREAID = Ecritures.DATAAREAID   
INNER JOIN 
    MicrosoftDynamicsAx.dbo.DIMENSIONHIERARCHYLEVEL As LevelTable ON LevelTable.DIMENSIONHIERARCHY = Ecritures.ACCOUNTSTRUCTURE
                                   AND LevelTable.PARTITION = @Partition
                                   AND LevelTable.DIMENSIONATTRIBUTE IN (Tmp1.TaskCode, Tmp1.Activity, Tmp1.BudgetNature, Tmp1.CentreCout)
INNER JOIN 
    MicrosoftDynamicsAx.dbo.DIMENSIONATTRIBUTE As DimAttr ON DimAttr.RECID = LevelTable.DIMENSIONATTRIBUTE
                              AND DimAttr.PARTITION = @Partition
ORDER BY  
    RecIdLine,DISPLAYVALUEComb , Niveau ASC, DimAttribute DESC

    --SELECT *  from #DISPLAYVALUEALL
这不管用。在select into语句中使用order by是否非法

这是我的结果

ReciID      DisplayValue        Dimension   Niveau
5637157342  601200-001-026--    22565421189 5
5637157342  601200-001-026--    22565421195 2
5637157342  601200-001-026--    22565421196 3
5637157342  601200-001-026--    22565421197 4

5637157326  601200-001-027--    22565421189 5
5637157326  601200-001-027--    22565421195 2
5637157326  601200-001-027--    22565421196 3
5637157326  601200-001-027--    22565421197 4
谢谢

更新:我的解决方案是添加以下行:

Row_number() over(ORDER BY Ecritures.RecIdLine, Ecritures.DISPLAYVALUEComb, LevelTable.LEVEL_ ASC, LevelTable.DIMENSIONATTRIBUTE DESC) as RowNumber,
我的剧本变成:

IF OBJECT_ID('tempdb..#DISPLAYVALUEALL') IS NOT NULL
            DROP TABLE #DISPLAYVALUEALL
    SELECT  Row_number() over(ORDER BY Ecritures.RecIdLine  ,Ecritures.DISPLAYVALUEComb , LevelTable.LEVEL_  asc, LevelTable.DIMENSIONATTRIBUTE  desc) as RowNumber,
                 Ecritures.RecIdLine       AS RecIdLine, 
                Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb,
                LevelTable.DIMENSIONATTRIBUTE   AS DimAttribute,
                LevelTable.LEVEL_          AS Niveau,
                DimAttr.Name               AS Dim_Label

        INTO #DISPLAYVALUEALL
        FROM #BudgetTransTmp        As Ecritures            

            INNER JOIN #InterfacesParmTmp   AS Tmp1
                ON Tmp1.DATAAREAID          = Ecritures.DATAAREAID  

            INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONHIERARCHYLEVEL      As LevelTable
                ON LevelTable.DIMENSIONHIERARCHY    = Ecritures.ACCOUNTSTRUCTURE
                AND LevelTable.PARTITION            = @Partition
                AND LevelTable.DIMENSIONATTRIBUTE   IN (Tmp1.TaskCode,Tmp1.Activity, Tmp1.BudgetNature, Tmp1.CentreCout)

            INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONATTRIBUTE   As DimAttr
                ON DimAttr.RECID                    = LevelTable.DIMENSIONATTRIBUTE
                AND DimAttr.PARTITION               = @Partition 
               ORDER BY RowNumber
现在,数据在表I中排序,检查方式为:

SELECT * from #DISPLAYVALUEALL

尝试按以下方式更改select查询并再次执行:

SELECT T.*
  INTO #DISPLAYVALUEALL
  FROM (SELECT  
         Ecritures.RecIdLine       AS RecIdLine, 
        Ecritures.DISPLAYVALUEComb AS DISPLAYVALUEComb,
        LevelTable.DIMENSIONATTRIBUTE   AS DimAttribute,
        LevelTable.LEVEL_          AS Niveau,
        DimAttr.Name               AS Dim_Label

FROM #BudgetTransTmp        As Ecritures            

    INNER JOIN #InterfacesParmTmp   AS Tmp1
        ON Tmp1.DATAAREAID          = Ecritures.DATAAREAID  

    INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONHIERARCHYLEVEL      As LevelTable
        ON LevelTable.DIMENSIONHIERARCHY    = Ecritures.ACCOUNTSTRUCTURE
        AND LevelTable.PARTITION            = @Partition
        AND LevelTable.DIMENSIONATTRIBUTE   IN (Tmp1.TaskCode,Tmp1.Activity, Tmp1.BudgetNature, Tmp1.CentreCout)

    INNER JOIN MicrosoftDynamicsAx.dbo.DIMENSIONATTRIBUTE   As DimAttr
        ON DimAttr.RECID                    = LevelTable.DIMENSIONATTRIBUTE
        AND DimAttr.PARTITION               = @Partition                        

 ORDER BY RecIdLine,DISPLAYVALUEComb , Niveau asc, DimAttribute desc) T

订购插入件没有任何目的

在没有订单的情况下,select没有保证订单

您需要将订单移动到

SELECT * from #DISPLAYVALUEALL
ORDER BY RecIdLine, DISPLAYVALUEComb , Niveau asc, DimAttribute desc
或者你可以用

SELECT * from #DISPLAYVALUEALL
 ORDER BY RowNumber

表中的行不是按逻辑顺序排列的。如果希望最后一个
选择
以特定顺序显示数据,则应在此处添加
order BY
子句。为什么要在插入之前对数据进行排序?因为我需要在第二个表中使用此order。我发现一些东西检查我的更新,就像我说的,数据在表中没有排序。(如果您有一个聚集索引,那么数据可以按该顺序进行物理存储,这可能有助于提高效率,但仍然不能保证它会以
SELECT
语句的顺序出现。)如果您在没有
orderby
的情况下执行
SELECT
,那么服务器可以按照它认为合适的任何顺序向您提供数据,这一点可以从一分钟变到下一分钟。您只需将
ORDER BY
放在
SELECT
上,就可以获得所需的排序结果,这有什么问题?您的“解决方案”可能随时都会失效。正如我所说,如果在
SELECT
语句中没有
orderby
,服务器可以按任意顺序返回行。只是因为它是按照你今天想要的顺序出现,并不意味着它明天就会按照你想要的顺序出现。谢谢你,我想我找到了一些东西。我更新了我的question@stoner尝试使用相同的原则:生成子查询I测试您的解决方案,但它会给我以下错误:
ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效,除非还指定了TOP、OFFSET或FOR XML。
@stoner首先,尝试在不使用INTO命令的情况下执行sql查询,只需selection@stoner它能给你结果吗?如果否,则表示select query不正确。我目前使用的是:
Row_number()(按Ecritures.RecIdLine、Ecritures.DISPLAYVALUEComb、LevelTable.LEVEL uuu asc、LevelTable.DIMENSIONATTRIBUTE desc排序)作为RowNumber,
我认为顺序正确。我可以看到您在使用什么。这是第二次“如果select没有订单,则没有保证订单”。