是否可以将值从PYODBC传递到表类型参数到SQL Server?

问题描述 投票:1回答:2

我创建了具有以下各列的测试类型作为表:

CREATE TYPE [dbo].[TestType] AS TABLE
                                (
                                    [TestField] [varchar](10) NULL,
                                    [TestField2] [int] NULL
                                )

然后我创建了一个存储过程,将该表类型作为参数。

CREATE PROCEDURE TestTypeProcedure (@tt TestType READONLY)
AS
    SELECT *
    FROM @tt;

我的目标是能够传递诸如列表列表之类的内容作为表类型的参数。那有可能吗?

myList = [['Hello!', 1], ['Goodbye!', 2]]
....
cursor.execute('{{Call {TestTypeProcedure} ({?})}}', myList)
sql-server python-3.x pyodbc
2个回答
1
投票
pyodbc.ProgrammingError:('SQL包含1个参数标记,但提供了2个参数','HY000')

由于表值参数是可迭代对象(最好是元组)的列表,所以会出现此错误...

my_tvp = [('Hello!', 1), ('Goodbye!', 2)] print(f"my_tvp contains {len(my_tvp)} row(s)") # my_tvp contains 2 row(s)

...如果直接将其传递给.execute(),则每一行都将被解释为参数值:

sql = "{CALL TestTypeProcedure (?)}" params = my_tvp print(f"calling SP with {len(params)} parameter value(s)") # calling SP with 2 parameter value(s) crsr.execute(sql, params) # error

因此,您需要将tvp包装在元组中以使其成为单个参数值

sql = "{CALL TestTypeProcedure (?)}" params = (my_tvp, ) # tuple containing a single tvp "object" print(f"calling SP with {len(params)} parameter value(s)") # calling SP with 1 parameter value(s) crsr.execute(sql, params) # no error


0
投票
[表值参数(TVP)在Python:3.7.4和Pyodbc:4.0.26中受支持。

有一个公开的反馈,声称(我没有测试过)您必须在SQL Server端使用dbo模式创建类型

您可以在以下GitHub反馈中阅读有关它的更多信息:https://github.com/mkleehammer/pyodbc/issues/595

更新:您可以在此处关注Microsoft“入门”文档:https://docs.microsoft.com/en-us/sql/connect/python/pyodbc/python-sql-driver-pyodbc?view=sql-server-ver15

© www.soinside.com 2019 - 2024. All rights reserved.