2015-05-05 64 views
0

我有一个存储过程每天运行,并做了简单的工作。它是如何工作的:从有序的选择结果插入

  1. 获得实际的实体“
  2. 填写临时表
  3. 选择从临时表
  4. 有序的数据填充另一个表3列 - 这里我有一个问题因为我不能从订购的选择插入。

所以。此时此地的过程:

ALTER PROCEDURE [dbo].[CreateQueueAccountOrder] 
    @dtUtc datetime 
AS 
BEGIN 
    delete from dbo.[Feedback.QueueAccountOrder] -- clean dest table 

    create table #TempTree 
    (
     [Total]   int, 
     [AccountCode] nvarchar(20), 
     [AccountName] nvarchar(512), 
     [Utc]   float, 
     [CityCode]  nvarchar(50), 
     [CityName]  nvarchar(128) 
    ) 

    -- getting actual flat tree 
    insert into #TempTree exec GetActualFeedbackQueueTree @dtUtc 

    declare @total int; 
    select @total = count(*) from #TempTree 
    print 'total nodes ' + str(@total) 

    select distinct tA.AccountCode, tA.AccountName, tA.Utc, tC.CityCode, tC.CityName 
    from #TempTree tC 
    left join #TempTree tA 
    on tA.CityCode = tC.CityCode 
    order by tC.CityName,tA.AccountName 
END 

另一个表:

CREATE TABLE [dbo].[Feedback.QueueAccountOrder](
    [QOrder] [int] NOT NULL, 
    [Code] [nvarchar](20) NOT NULL, 
    [Utc] [float] NULL 
) ON [PRIMARY] 

的目标是,以填补该表存储过程的最后选择的结果。并非QOrder需要是来自选择结果(1,2,3,4等),CodeUtc也来自选择结果。 所以。如何解决它?谢谢!

ps。堆栈: T-SQL,MS SQL Server 2012的

+1

为什么不加一个INSERT语句到存储过程'插入Feedback.QueueAccountOrder(QOrder,代码,UTC)选择...从#TempTree的tC 留在tA.CityCode = tC.CityCode'加入#TempTree TA –

回答

1

如果我理解正确你的目标 - 你需要的东西是这样的:

insert into dbo.Feedback.QueueAccountOrder 
(
    QOrder, 
    Code, 
    Utc 
) 
select 
    row_number() over(order by T.CityName, T.AccountName), 
    T.AccountCode, 
    T.Utc 
from 
(
    select distinct tA.AccountCode, tA.AccountName, tA.Utc, tC.CityCode, tC.CityName 
    from #TempTree tC 
     left join #TempTree tA on tA.CityCode = tC.CityCode 
) as T 

我不知道有关字段映射在最终选择,因为它不清楚问题 - 它应该是AccountCode还是CityCode - 取决于您。

但主要思想保持不变 - 首先选择不同的值,然后使用row_number作为结果集的枚举器插入select中的数据。

+0

非常感谢!它工作真棒 – user2598575