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转换为数据类型数字的算术溢出错误的主要内容,如果未能解决你的问题,请参考以下文章
我正在尝试检查电子邮件是不是已存在于数据库中或不在数据库中,但我的代码会引发错误