Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Python ruft gespeicherte SQL-Server-Prozedur mit Tabellenwertparameter auf

Auf der Grundlage der Kommentare zu meiner Frage habe ich es geschafft, die gespeicherte Prozedur mit Tabellenwertparametern zum Laufen zu bringen (und die Rückgabewerte vom SP zu erhalten). Das endgültige Skript lautet wie folgt:

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)

Das Autocommit wird in der Verbindung hinzugefügt (um die Transaktion im Cursor festzuschreiben), der Tabellenwertparameter (marchcolumntable) erwartet 2 Spalten, also wird das arg so modifiziert, dass es in 2 Spalten passt.

Die neben dem tvp erforderlichen Parameter sind im exec-String enthalten. Der letzte Parameter in der Ausführungszeichenfolge ist der Name des tvp-Parameters (mergeoncolumn), der mit dem tvp.

gefüllt wird

Optional können Sie den Ergebnisstatus oder die Zeilenanzahl hinzufügen, wie in der pytds-Dokumentation beschrieben:https://python-tds.readthedocs.io/en/latest/index.html

Hinweis! :In der gespeicherten Prozedur müssen Sie sicherstellen, dass das SET NOCOUNT ON hinzugefügt wird, sonst erhalten Sie keine Ergebnisse an Python zurück