2014-01-13 33 views
1

我试图更新SQL数据库中的一些预算数据。我有一个表,这是今年的数据集,另一个表包含去年(我需要插入今年的数据)。 在插入过程中,我需要为临时表中的每个站点编号创建一个唯一的行,每个站点编号需要是今年的信息(周编号,startdate,enddate等)。 我已经尝试使用子查询(但显然这失败了,因为获取站点编号的子查询将返回多个记录,所以我尝试了一个cursor,但是,虽然它没有错误,但它不会插入任何日期。任何人有那简直太好了任何想法 这是我cursor codeSQL从子查询中包含多行的2个表中插入

create table #tempSiteNoTable (SiteNo int) 
insert into #tempSiteNoTable 
Select distinct(SiteNumber) 
from Lynx_Period_Lookup 

    begin tran xxx 
    Declare @SiteNNo int 

    Declare SiteNumberCursor Cursor FOR 
     Select 
      SiteNo from #tempSiteNoTable where SiteNo = @SiteNNo 
     Open SiteNumberCursor 
    Fetch next from SiteNumberCursor 
    Into @SiteNNo while @@fetch_status = 0 

    begin 
     insert into Lynx_Period_Lookup 
      (SiteNumber,SubPeriod,StartDate,EndDate,[Year],Period,[Week],BusinessCalendarNumber,BusinessCalendarName) 
      Select 
      @SiteNNo, 
      SubPeriod, 
      StartDate, 
      EndDate, 
      2014 as year, 
      Period, 
      WeekNo, 
      BusinessCalendarNumber, 
      BusinessCalendarName 
      from accountingperiods 
      Fetch next from SiteNumberCursor 
      into @SiteNNo 

    End 
     Close SiteNumberCursor 
    Deallocate SiteNumberCursor 

回答

0

你应该能够做到这一点没有CURSOR - 和很容易,太

试试这个:!

CREATE TABLE #tempSiteNoTable (SiteNo int) 

INSERT INTO #tempSiteNoTable(SiteNo) 
    SELECT DISTINCT (SiteNumber) 
    FROM dbo.Lynx_Period_Lookup 

INSERT INTO dbo.Lynx_Period_Lookup(SiteNumber, SubPeriod, StartDate, EndDate, [Year], Period, [Week], BusinessCalendarNumber, BusinessCalendarName) 
    SELECT 
     t.SiteNo, 
     ap.SubPeriod, 
     ap.StartDate, 
     ap.EndDate, 
     2014 as year, 
     ap.Period, 
     ap.WeekNo, 
     ap.BusinessCalendarNumber, 
     ap.BusinessCalendarName 
    FROM 
     #tempSiteNoTable t 
    INNER JOIN 
     dbo.AccountingPeriods ap ON ... (how are those two sets of data related?)... 

唯一的一点我不知道 - AccountingPeriods#tempSiteNoTable如何相关 - 他们共享什么常见列?

这一切就是这么简单 - 没有光标,没有与瞎搞行到痛苦的排(RBAR)处理 - 只有一个,漂亮,干净基于集合的声明,你就大功告成了

0

我想你正在寻找CROSS JOIN;尝试下面的代码片段。

DECLARE @Table1 TABLE (Week int, StartDate datetime) 
DECLARE @Table2 TABLE (sitenumber int) 

INSERT INTO @Table1 (Week, StartDate) 
VALUES (1, '2014-01-01'), (2, '2014-01-08') 

INSERT INTO @Table2 (sitenumber) 
VALUES (1), (2) 

SELECT * 
FROM @Table1 CROSS JOIN @Table2