не работает сложный SQL запрос в Pythone

Подключился в Python к SQL через библиотеку pyodbc, запросы SELECT * FROM выполняет, но мне дали сложный запрос который в MSSMS из нескольких таблиц формирует отчет по зарплате у сотрудников на сделке, в запросе есть выбор по периоду дней и выбору категории сотрудников или выбор сотрудника по ФИО. В Pythone выдает ошибку, запрос не работает, подскажите как реализовывать такие сложные запросы в Питоне. Может я такой сложный запрос не правильно оформляю?

import pyodbc
driver = '{ODBC Driver 17 for SQL Server}'
server = '*****\SQLEXPRESS2017'
database = '******'
username = '*******'
password = '*******'
connect = pyodbc.connect('DRIVER=' + driver
                         + ';SERVER=' + server
                         + ';DATABASE=' + database
                         + ';UID=' + username
                         + ';PWD=' + password)
cursor = connect.cursor()

for row in cursor.execute('declare @DStart datetime, @DFinish datetime, @SFio varchar(50),  @SPodr varchar(50), @CKorp bit, @CSoft bit, @cMetal bit, @COhr bit
-- начало периода
set @DStart=convert(datetime,'01.03.2022',104)  
-- конец периода
set @DFinish=convert(datetime,'01.03.2022',104) 
-- Фамилия исполнителя (ищется на вхождение в строку), если пустая строка - по всем исполнителям
set @SFio='Абзал'  
-- выбор подразделения, если 1 - подразделение выбрано, 0 - не выбрано
set @CKorp =1   -- Цех корпусной мебели
set @CSoft =1   -- Цех мягкой мебели
set @cMetal=1   -- Цех металлопродукции
set @COhr  =1   -- Охрана

set @SPodr=cast(@CKorp as varchar)+cast(@CSoft as varchar)+cast(@cMetal as varchar)+cast(@COhr as varchar)

SELECT 
 pk.idPerson as idPerson,
 MAX(isnull(pk.PersonF,'')+' '+isnull(pk.PersonI,'')+' '+isnull(pk.PersonO,'')) as fio,
 max(dl.DolznostName) as DolznostName,
 SUM(case when gp.countPerson>0 then gp.ParameterCount/gp.countPerson else gp.ParameterCount END) as PkSum
FROM
(select Oper.extGroupPerson,
       SUM(CASE when (Oper.extProizvDetail<=0 and PrOper.ProizvOperFinish=1)
                    or (Rout.RouteForIzd=1)
           then dbo.aiUDF_GetRouteMainParam(Oper.extProizvOper,
                                            Oper.extProduct,
                                            Oper.extProizvAddr) 
           else Rout.RouteMainParam
          END * CASE when Rout.RouteForIzd=1
                     then dbo.aiUDF_GetIzdCount(Oper.extProizvOper,
                                      Oper.extProduct,
                                      Oper.extColor,
                                      Oper.extProizvTask,
                                      Oper.extProizvAddr,
                                      izd.ProizvTaskIzdCount,
                                      Oper.ExecDefect,
                                      oper.ProizvTaskOperDate) 
                     else Batch.ProizvTaskBatchCount-Oper.ExecDefect
                END) as ParameterCount
    ,MAX(PCount.countPerson) countPerson                             
from aiTB_ProizvTaskOper as Oper
       left join (select extProizvGroup, COUNT(extPerson) as countPerson
                  from aiTB_ProizvGroupPerson
                  group by extProizvGroup) as PCount
         on (PCount.extProizvGroup = oper.extGroupPerson)
       left join aiTB_ProizvAddr as Addr
         on (Addr.idProizvAddr = Oper.extProizvAddr)
       left join aiTB_ProizvOper as PrOper
         on (PrOper.idProizvOper = Oper.extProizvOper)
       left join kpgTB_KatProduct as KatProd
         on (KatProd.idProduct = Oper.extProduct)
       left join aiTB_ProizvDetail  as Detail
         on ( (Detail.extProduct = Oper.extProduct)
               and (detail.extPackage = Oper.extPackage)
               and ( Detail.idProizvDetail = Oper.extProizvDetail))
       left join aiTB_ProizvRoute as Rout
         on((rout.extProizvDetail = Oper.extProizvDetail)and(rout.extProizvOper = Oper.extProizvOper))
       left join aiTB_ProizvTaskBatch Batch
         on (batch.idProizvTaskBatch = oper.extProizvTaskBatch)
       left join aiTB_ProizvTaskIzd as izd
         on (izd.extProizvTask=batch.extProizvTask
             and izd.extProduct=batch.extProduct
             and izd.extColor=batch.extColor)
where oper.ProizvTaskOperStatus = 2  --операция выполнена
  and cast(oper.ProizvTaskOperDate as date)>=cast(convert(datetime,@DStart,104) as date)
  and cast(oper.ProizvTaskOperDate as date)<=cast(convert(datetime,@DFinish,104) as date)
  and Oper.extGroupPerson>0
  and (@SFio='' or UPPER(dbo.aiUDF_GroupPersonTextbyGroup(Oper.extGroupPerson)) like '%'+@SFio+'%')
  and dbo.aiUDF_AddrIsInZone(Addr.extProizvAddrZone,@SPodr)=1
group by Oper.extGroupPerson) as gp
left outer join aiTB_ProizvGroupPerson as pp
   on (gp.extGroupPerson=pp.extProizvGroup)
left outer join kpgTB_PersonKat as pk
   on (pp.extPerson=pk.idPerson)
left outer join kpgTB_Dolznost as dl
   on (pk.cPersonDolznost=dl.idDolznost)
WHERE gp.ParameterCount>0
  and (@SFio='' or UPPER(isnull(pk.PersonF,'')+' '+isnull(pk.PersonI,'')+' '+isnull(pk.PersonO,'')) like '%'+@SFio+'%')
GROUP BY pk.idPerson
ORDER BY 2'):

print(row)

Как сделать чтобы этот запрос выполнился?


Ответы (0 шт):