Ошибка создания SP с темпоральной таблицей внутри и подзапросом - PullRequest
1 голос
/ 08 ноября 2011

Я создал эту временную таблицу в своей процедуре хранения, как вы можете видеть, у меня более 1 записи для одного и того же идентификатора:

@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 Ответ

2 голосов
/ 08 ноября 2011

Я не знаю, как ваш второй запрос работает для вас «в 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 …

Это может сделать ваши запросы болеечитаемый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...