не работает сложный 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)
Как сделать чтобы этот запрос выполнился?