执行SQL插入语句无结果,查询返回零行,求解决方案
问题描述
创建了带IDENTITY列的临时表#tmp1,插入数据后可正常使用,但后续关联多表的INSERT...SELECT语句没有生成任何结果,SELECT查询返回零行。以下是当前使用的SQL代码:
create table #tmp1 ([TImesheetID] [int] IDENTITY(1,1) not null, PersonID varchar(10), Orderid varchar (10)) insert into #tmp1 select Tr.PersonId, TR.OrderId from temp_runupload TR Left join Person_Identification PI on PI.PersonId=TR.PersonId group by TR.PersonId, TR.OrderId select * from #tmp1 declare @yearweek varchar(6) ='202245' declare @runid varchar (2) ='86' set @yearweek=202245 set @runid=80 insert into Timesheets (YearWeek, RunID, TimeSheetID, orderID, PersonID, PersonDetailRecord, TimeSheetType, RegHours, OTHours, PayRate, BillRate, AmountField1, AmountField2, AmountField3, RateField1,RateField2, RateField3, PayCycle, CostField1, CostField2, InvoiceID, PersonWeek, Message,TSStatus, CompanyPO, ContactName, ApYearWeek, SeparateInvoice, CalledIn,TimeslipKey,SwipeTSDate,sICPBatchID, dCommissionPercent,DoNotMail,InvoiceMsg,ETransfer) select distinct @yearweek ,@RunID ,TimeSheetID = right('000'+cast(t1.timesheetid as varchar(4)),4) ,Orderid=t1.OrderID ,Personid=t1.personid ,DetailRecId = max(OPDR.DetailRecId) ,OPS.[TimeSheetType] ,RegHours = TR.reghrs ,OTHours = TR.othrs ,PayRate=isnull(OPS.PayRate,0) ,BillRate = TR.BillRate ,0--[AmountField1] ,0--[AmountField2] ,0--[AmountField3] ,0--[RateField1] ,0--[RateField2] ,0--[RateField3] ,PAY.[PayCycle] ,0--[CostField1] ,0--[CostField2] ,null --[InvoiceId] ,@yearweek --[PersonWeek] ,null--[Message] ,'O'--[TSStatus] ,OH.[CompanyPO] ,null --contact name --,@yearweek --[AppYearWeek] ,null -- [SeparateInvoice] ,'N' --[CalledIn] ,null --[TimeslipKey] ,null --[SwipeTSDate] ,null --[sICPBatchID] ,null --[dCommissionPercent] ,null --[DoNotMail] ,null --[InvoiceMsg] ,null from temp_runupload TR inner join Person_Identification PI on PI.PersonId=TR.PersonId inner join #tmp1 T1 on PI.personid=T1.PersonID inner join Order_Person_Detail_Record OPDR on OPDR.OrderId=TR.orderid inner join payroll_information PAY on PAY.personid=TR.personid inner join Order_Pay_Structure OPS on OPS.orderid=TR.OrderId and OPS.paystructurecounter=OPDR.paystructurecounter inner join order_header OH on OH.orderid=OPDR.orderid group by T1.timesheetid,T1.OrderId, T1.PersonId, ops.TimeSheetType,ops.PayRate, tr.BillRate, pay.PayCycle, oh.DefaultCompanyPO, tr.reghrs, TR.OTHrs
排查步骤
- 先确认#tmp1的数据:单独运行
select * from #tmp1,确保有数据返回。如果这里没数据,先排查insert into #tmp1语句,比如temp_runupload表是否有数据,Left join后的GROUP BY是否过滤了所有记录。 - 逐步拆解关联查询:从基础表开始,每次只加一个JOIN,运行后查看结果:
- 先运行
SELECT * FROM temp_runupload TR,确认源表有数据。 - 添加第一个INNER JOIN:
SELECT * FROM temp_runupload TR INNER JOIN Person_Identification PI ON PI.PersonId=TR.PersonId,检查是否还有数据(INNER JOIN会过滤掉PI中无匹配的TR记录)。 - 继续添加
INNER JOIN #tmp1 T1 ON PI.personid=T1.PersonID,确认T1和PI的PersonID能匹配上。 - 依次添加剩余的INNER JOIN(OPDR、PAY、OPS、OH),每次运行后查看结果,找到哪个JOIN导致数据消失——INNER JOIN要求两边都有匹配记录,只要其中一个表无匹配,整行就会被过滤。
- 先运行
- 检查GROUP BY和聚合函数:你用了
max(OPDR.DetailRecId),同时GROUP BY包含多个字段,确认这些字段组合下是否有对应的OPDR记录。 - 核对列数:INSERT语句的列列表里包含
ApYearWeek,但SELECT语句中该列被注释掉了,导致SELECT的列数比INSERT少一列,这会直接导致插入失败,需要补上该列的取值(比如取消注释@yearweek,或者设为null)。 - 检查变量类型:@yearweek定义为varchar(6),但后面赋值
set @yearweek=202245(数字),虽然SQL会自动转换,但建议保持类型一致,用set @yearweek='202245'。
内容的提问来源于stack exchange,提问作者jin
相关产品推荐
相关产品推荐

