SQL TVP错误:行必须为序列对象

MSSQL 数据库插入数据 A TVP’s rows must be Sequence objects.", ‘HY000’ 错误原因

这个错误出现的原因是在使用 Table-Valued Parameter (TVP) 插入数据到 MSSQL 数据库时,传递的参数格式不正确。错误消息 “A TVP’s rows must be Sequence objects” 表明你传递给 TVP 的行数据不是序列类型对象。

在 Python 中使用 pyodbc 或类似库操作 MSSQL 时,当使用 TVP 插入数据,每一行数据必须是一个序列类型对象(如列表、元组等)。

解决方法:

  1. 确保你传递给 TVP 的每一行数据是列表或元组格式
  2. 整个数据集应该是一个包含多个序列(行)的列表

示例代码修正:

# 错误的方式
tvp_data = {"column1": "value1", "column2": "value2"}  # 这是字典,不是序列

# 正确的方式
tvp_data = [
    ("value1", "value2", "value3"),  # 第一行,使用元组
    ["value4", "value5", "value6"],  # 第二行,使用列表
]

# 然后在执行时:
cursor.execute("EXEC YourStoredProcedure @TVP=?", (tvp_data,))

确保数据结构匹配你在SQL Server中定义的TVP结构,并且每行数据使用序列类型(列表或元组)而不是字典或其他非序列类型。

针对上面的说法,我们在插入数据的时候遇到的问题就是我们尝试把字典类型插入到数据库中而出现的错误。

当我们把要插入的字典转换成字符串后进行插入就能正确插入数据。