Berdasarkan komentar untuk pertanyaan saya, saya telah berhasil menjalankan prosedur tersimpan dengan parameter bernilai tabel (dan mendapatkan nilai pengembalian dari SP) Skrip terakhir adalah sebagai berikut:
import pandas as pd
import pytds
from pytds import login
import sqlalchemy as sa
from sqlalchemy import create_engine
import sqlalchemy_pytds
def connect():
return pytds.connect(dsn='ServerName',database='DBName',autocommit=True, auth=login.SspiAuth())
engine = sa.create_engine('mssql+pytds://[ServerName]', creator=connect)
conn = engine.raw_connection()
with conn.cursor() as cur:
arg = [["foo.ExternalInput","bar.ExternalInput"]]
tvp = pytds.TableValuedParam(type_name="core.MatchColumnTable", rows=arg)
cur.execute("EXEC test_proc @Target = N'[dbname].[tablename1]', @Source = N'[dbname].[table2]', @CleanTarget = 0, @UseColumnsFromTarget = 0, @MergeOnColumn = %s", (tvp,))
result = cur.fetchall()
print(result)
Autocommit ditambahkan dalam koneksi (untuk melakukan transaksi di kursor), parameter nilai tabel (marchcolumntable) mengharapkan 2 kolom, sehingga arg dimodifikasi agar sesuai dengan 2 kolom.
Parameter yang diperlukan selain tvp termasuk dalam string exec. Param terakhir pada string execute adalah nama parameter tvp(mergeoncolumn) yang diisi dengan tvp.
opsional, Anda dapat menambahkan status hasil atau jumlah baris seperti yang dijelaskan dalam dokumentasi pytds:https://python-tds.readthedocs.io/en/latest/index.html
Perhatikan! :dalam prosedur tersimpan Anda harus memastikan bahwa SET NOCOUNT ON ditambahkan jika tidak, Anda tidak akan mendapatkan hasil apa pun kembali ke Python