SQL / Python尝试检查数据是不是已存在:将nvarchar转换为数据类型数字的算术溢出错误

Posted

技术标签:

【中文标题】SQL / Python尝试检查数据是不是已存在:将nvarchar转换为数据类型数字的算术溢出错误【英文标题】:SQL / Python Trying to check if data already exists: Arithmetic overflow error converting nvarchar to data type numericSQL / Python尝试检查数据是否已存在:将nvarchar转换为数据类型数字的算术溢出错误 【发布时间】:2020-10-12 18:16:15 【问题描述】:

我正在尝试遍历表以检查是否已经提交了一行数据。我插入了 5 行,然后制定了在插入或跳过之前检查工作行是否存在的解决方案。这适用于 10 行数据。然后我取出限制并尝试插入所有剩余的行。但是,在第 18 行,我的解决方案遇到了错误:

Traceback (most recent call last):
...
    cursor_object.execute("""SELECT COUNT(*) 
pyodbc.DataError: ('22003', '[22003] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Arithmetic overflow error converting nvarchar to data type numeric. (8115) (SQLExecDirectW)')

这是我改编自 Stack Overflow 上的 this discussion 的代码。

    for filing in directory_list:
        value_list = []

        value = filing['filing']['report_num']
        
        print(filing)
        cursor_object.execute("""SELECT COUNT(*) 
                                FROM filings_table 
                                WHERE report_num =  
                                GROUP BY report_num""".format(value))

        exists = cursor_object.fetchone()
        print(exists)

它在显示的最后一个文件上失败。紧接其上方的是编号序列中的数字异常。我已经验证它在源 index.json 文件中是有效的。

Filing already in database.
'filing': 'report_num': '999999999520001257', 'filing_date': '2020-05-27', 'url': 'https://www.sec.gov/Archives/edgar/data//0001465885/999999999520001257/9999999995-20-001257-index.html', 'report_type': 'Form EFFECT', 'cik_num': '0001465885'
(1, )
Filing already in database.
'filing': 'report_num': '000162828020008319', 'filing_date': '2020-05-22', 'url': 'https://www.sec.gov/Archives/edgar/data//0001465885/000162828020008319/0001628280-20-008319-index.html', 'report_type': 'Form CORRESP', 'cik_num': '0001465885'
Traceback (most recent call last):

如何解决这个不应该发生任何算术或转换的问题?

编辑:如果没有匹配,则 select 函数返回 'None',如果有匹配则返回 '(1, )'。

【问题讨论】:

select schema_name(tab.schema_id) as schema_name, tab.name as table_name, col.column_id, col.name as column_name, t.name as data_type, col.max_length, col.precision from sys.tables as tab inner join sys.columns as col on tab.object_id = col.object_id left join sys.types as t on col.user_type_id = t.user_type_id where table_name = 'filings_table' order by schema_name, table_name, column_id; 显示什么? schema table_name col_id column_name data_type max_length precision dbo filings_table 1 report_num nvarchar 100 0 dbo filings_table 2 filing_date date 3 10 dbo filings_table 3 url varchar -1 0 dbo filings_table 4 report_type nvarchar 100 0 dbo filings_table 5 cik_num nchar 20 0 【参考方案1】:

原来问题在于 SQL Server 正在执行隐式转换。在括号中加上引号解决了这个问题。归功于我的妻子,她在大约 2 分钟内就搞定了。

cursor_object.execute("""SELECT COUNT(*) 
                         FROM filings_table 
                         WHERE report_num = ''
                         GROUP BY report_num""".format(value))

【讨论】:

以上是关于SQL / Python尝试检查数据是不是已存在:将nvarchar转换为数据类型数字的算术溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

检查 SQL Server 登录是不是已存在

检查数据库中是不是已存在电子邮件地址

我正在尝试检查电子邮件是不是已存在于数据库中或不在数据库中,但我的代码会引发错误

如何检查数据库中是不是已存在该值?

C#。当我尝试检查用户是不是存在于我的 SQL 数据库中时,我的 Windows 窗体应用程序崩溃

使用 Python 检查标签是不是已存在于 Adwords 帐户中?