MSSQL 'Numeric Value Out of Range' 20 位数字错误 python Long Int into Numeric(24,0) Column

MSSQL 'Numeric Value Out of Range' Error for 20 digit python Long Int into Numeric(24,0) Column

我正在尝试将 20 位 64 位 python 长整数插入到 MSSQL Numeric(24,0) 列中。这会导致来自 MSSQL 的 'Numeric Value Out of Range' 错误。我正在使用 pypyodbc 模块和 ODBC Driver 13 for SQL Server 从我的 python 应用程序中插入数据。

我尝试在 SQL 中使用 Numeric(38,0) 列来测试限制,但收到相同的错误。在插入语句中,我还尝试将 id 显式转换为 Numeric(24,0) 数据类型。所有尝试都导致相同的错误。

#Python SQL Insert Code
id = 'ADD7A9FA-E77B-4BBB-92AA-3D9C7BBB44D0'
idlist =  id.split('-')

val = [int(idlist[0] + idlist[1] + idlist[2], 16), 
int(idlist[3] + idlist[4], 16)]

cmd = "INSERT INTO jssuser.dbo.API_VIMSPost (\
[id_int1], \
[id_int2]) \
VALUES (?, ?)"

#function to simplify the use of pypyodbc
sqlcmd.sqlCmd(cmd, values = val)

#SQL Table Code
USE [jssuser]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[API_VIMSPost](
    [id_int1] [numeric](24, 0) NOT NULL,
    [id_int2] [numeric](24, 0) NOT NULL,
 CONSTRAINT [PK_PostID] PRIMARY KEY CLUSTERED 
(
    [id_int1] ASC,
    [id_int2] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = 
OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

我希望 20 位和 64 位的 python long int 适合 MSSQL 类型为 Numeric(20,0) 或更大的列。但是,插入会导致 'Numeric Value Out of Range' 错误。

Python 整数值的大小仅受可用内存的限制;它们不限于任意数量的位。但是,SQL 服务器 ODBC 驱动程序可以处理的最大整数值是(64 位有符号)bigint,其最大正值为 math.pow(2, 63) - 1,或 9223372036854775807 长度为十九 (19) 位。

当 pypyodbc 尝试传递 20 位整数时,ODBC 驱动程序会阻塞它,因此失败

x = 13807673592980537824
crsr.execute("CREATE TABLE ##tmp (id INT PRIMARY KEY, id_int1 NUMERIC(24, 0))")
sql = "INSERT INTO ##tmp (id, id_int1) VALUES (?, ?)"
params = (1, x)
crsr.execute(sql, params)

但是,以下内容有效,因为 pypyodbc 没有告诉 ODBC 驱动程序需要一个整数

x = 13807673592980537824
crsr.execute("CREATE TABLE ##tmp (id INT PRIMARY KEY, id_int1 NUMERIC(24, 0))")
sql = "INSERT INTO ##tmp (id, id_int1) VALUES (?, ?)"
params = (1, Decimal(x))  # convert Python `int` to Python `decimal.Decimal`
crsr.execute(sql, params)