Trên cơ sở các nhận xét cho câu hỏi của tôi, tôi đã quản lý để chạy thủ tục được lưu trữ với các tham số có giá trị của bảng (và nhận các giá trị trả về từ SP) Tập lệnh cuối cùng như sau:
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 được thêm vào kết nối (để thực hiện giao dịch trong con trỏ), tham số có giá trị trong bảng (Marchcolumntable) yêu cầu 2 cột, vì vậy, đối số được sửa đổi để phù hợp với 2 cột.
Các tham số được yêu cầu bên cạnh tvp được bao gồm trong chuỗi thực thi. Tham số cuối cùng trong chuỗi thực thi là tên của tham số tvp (mergeoncolumn) được lấp đầy bởi tvp.
tùy ý, bạn có thể thêm trạng thái kết quả hoặc số hàng như được mô tả trong tài liệu pytds:https://python-tds.readthedocs.io/en/latest/index.html
Lưu ý! :trong thủ tục được lưu trữ, bạn phải đảm bảo rằng BẬT TÀI KHOẢN BẬT được thêm vào, nếu không bạn sẽ không nhận được bất kỳ kết quả nào về Python