Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Python chiama la stored procedure sql-server con parametro con valori di tabella

Sulla base dei commenti alla mia domanda sono riuscito a far funzionare la stored procedure con parametri con valori di tabella (e ottenere i valori di ritorno dall'SP) Lo script finale è il seguente:

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)

L'autocommit viene aggiunto nella connessione (per eseguire il commit della transazione nel cursore), il parametro con valore di tabella (marchcolumntable) prevede 2 colonne, quindi l'arg viene modificato per adattarsi a 2 colonne.

I parametri richiesti oltre a tvp sono inclusi nella stringa exec. L'ultimo parametro nella stringa di esecuzione è il nome del parametro tvp(mergeoncolumn) che è riempito con il tvp.

facoltativamente puoi aggiungere lo stato del risultato o il conteggio delle righe come descritto nella documentazione di pytds:https://python-tds.readthedocs.io/en/latest/index.html

Nota! :nella procedura memorizzata devi assicurarti che SET NOCOUNT ON sia aggiunto altrimenti non otterrai alcun risultato su Python