Pyodbc 'Object reference not set to an instance of an object.'。 (111213) 带散装插件

Pyodbc 'Object reference not set to an instance of an object.'. (111213) with bulk insert

我一直在使用以下代码在我们的 Azure SQL 池(以前称为 SQL DW)上进行批量插入:

def save_sql_bulk(self, table_name, schema, file_path):
        logging.info(f"Starting proccess to save data to table:{table_name}")

        logging.info(f"Connecting to sink database: {sy_server}")
        cnxn_sy = pyodbc.connect(sy_cnxn)



        logging.info(f"Appending to table: {table_name} with schema: {schema} from path: {file_path}")
        query = f'''

                COPY INTO {schema}.{table_name}

                FROM 'https://siidatalake.blob.core.windows.net/containername/{file_path}'

                WITH(

                    FIRSTROW = 2,

                    FILE_TYPE = 'CSV',

                    MAXERRORS = 100,

                    FIELDTERMINATOR = ';',

                    CREDENTIAL = (IDENTITY= 'MANAGED IDENTITY')

                )'''

        logging.info(f"Executing query: \n {query} \n")
        print(f"Executing query: \n {query} \n")
        cnxn_sy.execute(query)
        cnxn_sy.commit()
        cnxn_sy.close()

        logging.info(f"Done appending without problems.. ")

总而言之,我在大多数情况下都没有任何问题,但有时我在执行这样的语句时会遇到以下问题:

Exception while proccesing [file_path] with error [('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]111213;The current transaction has aborted, and any pending changes have been rolled back. Cause: 111208;An internal error occurred that prevents further processing of this command: 'Object reference not set to an instance of an object.'. (111213) (SQLExecDirectW)")]

有时甚至发生在已经工作了一段时间的进程中,这意味着什么?我的 table 定义没有改变,即使使用之前已经处理过的数据,进程也会失败,为了获得更多上下文,我插入了几百万行。我在另一个线程中读到它可能与数据库相关,但在我的情况下,我的数据库由 Azure 维护,所以我不认为这个问题可以通过数据库补丁或重新安装来解决,有什么想法吗?

谢谢。

解决方案是在 pyodbc 连接中使用自动提交选项。 Azure 的 SQL 池似乎需要它来避免此问题。