使用临时表和子查询创建SP时出错

时间:2011-11-08 05:18:57

标签: sql-server-2008

我已经在我的商店程序中创建了这个时态表,因为你可以看到我有相同ID的多条记录:

@tmpTableResults
TmpInstallerID      TmpConfirmDate  TmpConfirmLocalTime 
==============      ==============  ===================
173                 2011-11-08      11:45:50
278                 2011-11-04      09:06:26
321                 2011-11-08      13:21:35
321                 2011-11-08      11:44:54
483                 2011-11-08      11:32:00
483                 2011-11-08      11:31:59
645                 2011-11-04      10:03:15
645                 2011-11-04      07:03:15

这是创建@tmpTableResults

的查询结果
DECLARE @tmpTableResults TABLE
(
    TmpInstallerID int,
    TmpConfirmDate date,
    TmpConfirmLocalTime time

)

DECLARE @tmpTableQuery VarChar(800)

SET @tmpTableQuery = 'select FxWorkorder.INSTALLERSYSID, FxWorkorder.CONFIRMDATE, FxWorkorder.CONFIRMLOCALTIME from FxWorkorder   
   join install on FxWorkorder.INSTALLERSYSID = install.sysid 
   join RouteGroupWorkarea on FxWorkorder.WORKAREAGROUPSYSID = RouteGroupWorkarea.IWORKAREA_ID
   join RoutingGroup on RouteGroupWorkarea.IRG_ID = RoutingGroup.IRG_IDENTITY 

   where FxWorkorder.SCHEDULEDDATE > = @StartDate and FxWorkorder.SCHEDULEDDATE <= @EndDate 
    and FxWorkorder.Jobstatus <> "Unassign"
    and FxWorkorder.Jobstatus <> "Route"  
    and install.FOXTELCODE <> ""
    and FxWorkorder.CONFIRMLOCALTIME is not null
    and FxWorkorder.CONFIRMDATE <> ""
    group by FxWorkorder.INSTALLERSYSID, FxWorkorder.CONFIRMDATE, FxWorkorder.CONFIRMLOCALTIME
    order by FxWorkorder.INSTALLERSYSID, FxWorkorder.CONFIRMDATE, FxWorkorder.CONFIRMLOCALTIME desc '

INSERT INTO @tmpTableResults EXEC(@tmpTableQuery)

我正在创建另一个查询以从另一个表中获取数据,并且只创建来自时态表的第一个记录,用于相同的INSTALLERSYSID

SELECT RoutingGroup.SDESCRIPTION, FxWorkorder.INSTALLERSYSID, FxWorkOrder.JOBSTATUS, Install.FOXTELCODE, 
    install.NAME, FxWorkOrder.ScheduledDate,
    count(*) as TotalJobs, COUNT(CONFIRMDATE) as ConfirmedJobs,
    (select TmpInstallerID, TmpConfirmDate, TmpConfirmLocalTime from @tmpTableResults where TmpInstallerID = FxWorkorder.INSTALLERSYSID)

from FxWorkorder 
   join install on fxworkorder.INSTALLERSYSID = install.sysid 
   join RouteGroupWorkarea on FxWorkOrder.WORKAREAGROUPSYSID = RouteGroupWorkarea.IWORKAREA_ID
   join RoutingGroup on  RouteGroupWorkarea.IRG_ID = RoutingGroup.IRG_IDENTITY 

where FxWorkorder.SCHEDULEDDATE  > = @StartDate and  FxWorkorder.SCHEDULEDDATE <= @EndDate  
    and FxWorkOrder.Jobstatus <> 'Unassign' 
    and FxWorkOrder.Jobstatus <> 'Route'  
    and Install.FOXTELCODE <> ''
group by RoutingGroup.SDESCRIPTION,FxWorkOrder.INSTALLERSYSID, FxWorkOrder.JOBSTATUS, Install.FOXTELCODE,install.NAME, FxWorkOrder.ScheduledDate,FxWorkOrder.WORKAREAGROUPSYSID

当我尝试保存sp时出现错误

“当EXISTS未引入子查询时,只能在选择列表中指定一个表达式。” 我不明白为什么我得到这个错误。但是,如果我在sql中运行查询工作。有人能看到错误吗?

1 个答案:

答案 0 :(得分:2)

我不知道你的第二个查询在sql中是如何起作用的(这应该是什么?你的意思是SSMS = SQL Server Management Studio吗?),但我确信它不可能在任何目前存在的SQL Server版本。这是因为SELECT列表中的这个子查询:

 (select TmpInstallerID, TmpConfirmDate, TmpConfirmLocalTime from @tmpTableResults where TmpInstallerID = FxWorkorder.INSTALLERSYSID)

问题是,SELECT子句中的每个表达式都应该是标量,但是此子查询返回多个值的。即使只有一行,它也是非法的,因为它返回了几列。该上下文中的子查询应返回不超过一个值,即它应该是一列,并且生成的结果应该不包含任何行或只包含一行。

您可以尝试使用此查询(虽然我不完全确定,但不知道有关您的架构的更多详细信息):

SELECT
    RoutingGroup.SDESCRIPTION,
    FxWorkorder.INSTALLERSYSID,
    FxWorkOrder.JOBSTATUS,
    Install.FOXTELCODE, 
    install.NAME, FxWorkOrder.ScheduledDate,
    count(*) as TotalJobs, COUNT(CONFIRMDATE) as ConfirmedJobs,
    tmp.TmpInstallerID,
    tmp.TmpConfirmDate,
    tmp.TmpConfirmLocalTime

from FxWorkorder 
   join install on fxworkorder.INSTALLERSYSID = install.sysid 
   join RouteGroupWorkarea on FxWorkOrder.WORKAREAGROUPSYSID = RouteGroupWorkarea.IWORKAREA_ID
   join RoutingGroup on  RouteGroupWorkarea.IRG_ID = RoutingGroup.IRG_IDENTITY 
   join @tmpTableResults tmp ON tmp.TmpInstallerID = FxWorkorder.INSTALLERSYSID

where FxWorkorder.SCHEDULEDDATE  > = @StartDate
    and FxWorkorder.SCHEDULEDDATE <= @EndDate  
    and FxWorkOrder.Jobstatus <> 'Unassign' 
    and FxWorkOrder.Jobstatus <> 'Route'  
    and Install.FOXTELCODE <> ''
group by
  RoutingGroup.SDESCRIPTION,
  FxWorkOrder.INSTALLERSYSID,
  FxWorkOrder.JOBSTATUS,
  Install.FOXTELCODE,install.NAME,
  FxWorkOrder.ScheduledDate,
  FxWorkOrder.WORKAREAGROUPSYSID
  tmp.TmpInstallerID,
  tmp.TmpConfirmDate,
  tmp.TmpConfirmLocalTime

也就是说,我添加了一个连接,一个连接到@tmpTableResults,并添加了您尝试提取到SELECT子句和GROUP BY子句的列。

另外,如果我是你,我会考虑为表使用短别名,如下所示:

SELECT
    …
    wo.INSTALLERSYSID,
    wo.JOBSTATUS,
    …
from FxWorkorder wo
   join …

这可能会使您的查询更具可读性。