Использование табличных параметров напрямую требует поддержки клиента, которую я не думаю, что pyodb c реализовал. Но лучший способ чтения и записи табличных данных из python - это JSON.
Вы можете отправлять табличные результаты на SQL Сервер как JSON и анализировать do c на сервере для загрузки TVP или обычной таблицы.
Вот пошаговое руководство. Кроме того, я изменил вашу хранимую процедуру, чтобы она возвращала несколько строк в качестве результата, вместо одного значения SCOPE_IDENTITY:
В SQL Запуск сервера:
use tempdb
go
drop table if exists tblCOVID19
drop procedure [spUpdateCases]
drop type [dbo].[tblTypeCOVID19]
go
create table tblCOVID19
(
ID int identity not null primary key,
StateName varchar(200),
COVID_Cases int,
DateEntered datetime default getdate()
)
go
CREATE TYPE [dbo].[tblTypeCOVID19] AS TABLE(
[ID] [int] NULL,
[StateName] [varchar](50) NULL,
[COVID_Cases] [int] NULL,
[DateEntered] [datetime] NULL
)
go
create or alter procedure [dbo].[spUpdateCases]
@StateValues tblTypeCOVID19 readonly
AS
BEGIN
set nocount on;
insert into tblCOVID19 (StateName, COVID_Cases)
output inserted.*
select StateName, COVID_Cases
from @StateValues;
END
И убедитесь, что он работает в T SQL следующим образом:
declare @json nvarchar(max) = '[{"STATENAME":"TX","COVID_Cases":212},{"STATENAME":"OK","COVID_Cases":41}]'
declare @tvp tblTypeCOVID19
insert into @tvp(StateName, COVID_Cases)
select StateName, COVID_Cases
from openjson(@json)
with
(
StateName varchar(200) '$.STATENAME',
COVID_Cases int '$.COVID_Cases'
)
exec [dbo].[spUpdateCases] @tvp
Затем вызовите его из python следующим образом:
import pandas as pd
import pyodbc
import json
# Create dataframe
data = pd.DataFrame({
'STATENAME':["TX", "OK"],
'COVID_Cases':[212, 41],
})
conn = pyodbc.connect('Driver={SQL Server};'
'Server=localhost;'
'Database=tempdb;'
'Trusted_Connection=yes;')
cursor = conn.cursor()
jsonData = data.to_json(orient='records')
print(jsonData)
sql = """
set nocount on;
declare @tvp tblTypeCOVID19
insert into @tvp(StateName, COVID_Cases)
select StateName, COVID_Cases
from openjson(?)
with
(
StateName varchar(200) '$.STATENAME',
COVID_Cases int '$.COVID_Cases'
)
exec [dbo].[spUpdateCases] @tvp
"""
cursor.execute(sql, jsonData)
results = cursor.fetchall()
print(results)