Можно ли передать значения в параметр типа таблицы с PYODB C на SQL Сервер? - PullRequest
1 голос
/ 10 апреля 2020

Я создал тип теста в виде таблицы со следующими столбцами:

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

Затем я создал хранимую процедуру, которая принимает этот тип таблицы в качестве параметра.

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

My Цель состоит в том, чтобы иметь возможность передавать что-то вроде списка списков в качестве параметра для типа таблицы. Это вообще возможно?

myList = [['Hello!', 1], ['Goodbye!', 2]]
....
cursor.execute('{{Call {TestTypeProcedure} ({?})}}', myList)

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

pyodb c .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

Следовательно, вам нужно обернуть ваш тв в кортеж, чтобы сделать его одним параметром

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 голосов
/ 10 апреля 2020

Параметры табличных значений (TVP) поддерживаются в Python: 3.7.4 и pyodb c: 4.0.26.

Существует открытая обратная связь, в которой утверждается (я ее не проверял), что Вы должны создать тип на стороне сервера SQL, используя схему dbo

. Подробнее об этом можно прочитать в следующем отзыве GitHub: https://github.com/mkleehammer/pyodbc/issues/595

Обновление: вы можете следить за документом Microsoft "Getting Started" здесь: https://docs.microsoft.com/en-us/sql/connect/python/pyodbc/python-sql-driver-pyodbc?view=sql-server-ver15

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...