【问题标题】:Is it possible to pass values to a table type parameter from PYODBC to SQL Server?是否可以将值从 PYODBC 传递到 SQL Server 的表类型参数?
【发布时间】:2020-04-10 20:20:31
【问题描述】:

我创建了一个测试类型作为包含以下列的表格:

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


    【解决方案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
    

    【讨论】:

    • 啊,这很有意义。它现在正在工作,所以感谢您的帮助。另外,我在这里经常看到你的名字,我已经回答了很多问题。感谢您为这里的人们提供的所有帮助。
    【解决方案2】:

    在 Python:3.7.4 和 pyodbc:4.0.26 中支持表值参数 (TVP)。

    有一个公开的反馈声称(我没有测试过)您必须在 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

    【讨论】:

    • 嗯,我似乎无法让它工作。它似乎正在读取列表中的每个列表作为参数,因为我一直遇到这个问题:pyodbc.ProgrammingError: ('The SQL contains 1 parameter markers, but 2 parameters were provided', 'HY000')
    • 关注微软“入门|”在此处记录:docs.microsoft.com/en-us/sql/connect/python/pyodbc/…
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 1970-01-01
    • 2016-01-26
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多