Данные не полностью записываются в базу данных, когда запускается задание Python Control-M, выполняющее хранимую процедуру через pyodbc

Я создаю задание Control-M для выполнения скрипта Python. Сценарий предназначен для выполнения хранимой процедуры на SQL Server. Хранимая процедура удалит некоторые записи из таблицы A, а затем откроет курсор для таблицы B, а затем вставит записи в таблицу A на основе информации из курсора. Вставка произойдет еще для двух курсоров для таблицы C и таблицы D.

Это хорошо работает, когда я вручную запускаю хранимые процедуры в SQL Server Management Studio 2012. Например, таблица А будет иметь 400 000 записей после запуска хранимой процедуры.

Однако таблица A будет содержать только 390 000 записей после выполнения задания control-M. Проблема была исправлена ​​путем разделения хранимой процедуры на четыре части: одну для удаления записей из таблицы A и три для вставки записей в таблицу A на основе записей, возвращаемых курсорами для таблиц B, C и D.

Кто-нибудь может посоветовать первопричину?

Python Script

import pyodbc as mssql
import re
import base64


def ExecuteSQL(ConnectionString, SqlQuery):
    print('Executing query.')
    connection = ConnectionString
    connectionTest = mssql.connect(connection, autocommit=True)
    cursor = connectionTest.cursor()
    cursor.execute(SqlQuery)
    print('Query executed.')
    connectionTest.commit()


if __name__ == '__main__':
    with open(
            r'<path>'
            r'<configfile>','r') as config:
        for line in config:
            if re.match('^SERVER', line):
                server = line.split(':')[1].strip()
            elif re.match('^DB', line):
                db = line.split(':')[1].strip()
            elif re.match('^UID', line):
                uid_en = line.split(':')[1].strip()
                uid = base64.b64decode(uid_en).decode('utf-8')
            elif re.match('^PWD', line):
                pwd_en = line.split(':')[1].strip()
                pwd = base64.b64decode(pwd_en).decode('utf-8')
    connection = 'DRIVER={ODBC Driver 11 for SQL Server};SERVER=' + server + ';DATABASE=' + db + ';UID=' + uid + ';PWD=' + pwd
    sql = 'EXEC MySchema.[USP_DATA_QUALITY_CHECK]'
    ExecuteSQL(connection, sql)

Хранимая процедура

USE <MyDataBase>
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO


CREATE PROCEDURE MySchema.[USP_DATA_QUALITY_CHECK]
AS   
BEGIN

--Delete raw score records for entities deactivated.

DELETE FROM MySchema.RPT_RAWSCORE
WHERE EntityID NOT IN (
    SELECT PropertyID FROM MySchema.STG_PROPERTY
)
AND EntityType = 1

DELETE FROM MySchema.RPT_RAWSCORE
WHERE EntityID NOT IN (
    SELECT AvailabilityID FROM MySchema.STG_AVAILABILITY
)
AND EntityType = 5

DELETE FROM MySchema.RPT_RAWSCORE
WHERE EntityID NOT IN (
    SELECT ListingID FROM MySchema.STG_LISTING
)
AND EntityType = 6

--Delete raw score records that need to redo data quality check.

DELETE FROM MySchema.RPT_RAWSCORE
WHERE EntityID IN (
    SELECT PropertyID FROM MySchema.STG_PROPERTY WHERE SkipDQ = 0
)
AND EntityType = 1

DELETE FROM MySchema.RPT_RAWSCORE
WHERE EntityID IN (
    SELECT AvailabilityID FROM MySchema.STG_AVAILABILITY WHERE SkipDQ = 0
)
AND EntityType = 5

DELETE FROM MySchema.RPT_RAWSCORE
WHERE EntityID IN (
    SELECT ListingID FROM MySchema.STG_LISTING WHERE SkipDQ = 0
)
AND EntityType = 6

UPDATE MySchema.RPT_RAWSCORE
SET DateKey = CONVERT(INT,CONVERT(VARCHAR, GETDATE(), 112))

DECLARE @Entity nvarchar(256), @DateKey INT, @market INT

DECLARE @getEntityID CURSOR

SELECT @DateKey=CONVERT(INT,CONVERT(VARCHAR, GETDATE(), 112))

SET @getEntityID = CURSOR FOR
SELECT PropertyID FROM MySchema.STG_PROPERTY WHERE SkipDQ = 0

OPEN @getEntityID
    FETCH NEXT
    FROM @getEntityID INTO @Entity
    WHILE @@FETCH_STATUS = 0
        BEGIN
            exec MySchema.[USP_Completeness_Check] @DateKey,@Entity,@entityID=1
            exec MySchema.[USP_Accuracy_Check] @DateKey,@Entity,@entityID=1
            FETCH NEXT FROM @getEntityID INTO @Entity
        END
        CLOSE @getEntityID;
        DEALLOCATE @getEntityID;

SET @getEntityID = CURSOR FOR
SELECT AvailabilityID FROM MySchema.STG_Availability WHERE SkipDQ = 0

OPEN @getEntityID
    FETCH NEXT
    FROM @getEntityID INTO @Entity
    WHILE @@FETCH_STATUS = 0
        BEGIN
            exec MySchema.[USP_Completeness_Check] @DateKey,@Entity,@entityID=5
            exec MySchema.[USP_Accuracy_Check] @DateKey,@Entity,@entityID=5
            FETCH NEXT FROM @getEntityID INTO @Entity
        END
        CLOSE @getEntityID;
        DEALLOCATE @getEntityID;

SET @getEntityID = CURSOR FOR
SELECT ListingID FROM MySchema.STG_LISTING WHERE SkipDQ = 0 

OPEN @getEntityID
    FETCH NEXT
    FROM @getEntityID INTO @Entity
    WHILE @@FETCH_STATUS = 0
        BEGIN
            exec MySchema.[USP_Completeness_Check] @DateKey,@Entity,@entityID=6
            exec MySchema.[USP_Accuracy_Check] @DateKey,@Entity,@entityID=6
            FETCH NEXT FROM @getEntityID INTO @Entity
        END
        CLOSE @getEntityID;
        DEALLOCATE @getEntityID;

END;


GO

0 ответов

Другие вопросы по тегам