Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Python appelle la procédure stockée sql-server avec un paramètre de table

Sur la base des commentaires à ma question, j'ai réussi à faire fonctionner la procédure stockée avec des paramètres de table (et à obtenir les valeurs de retour du SP) Le script final est le suivant :

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 est ajouté dans la connexion (pour valider la transaction dans le curseur), le paramètre de table (marchcolumntable) attend 2 colonnes, donc l'argument est modifié pour s'adapter à 2 colonnes.

Les paramètres requis en plus de tvp sont inclus dans la chaîne exec. Le dernier paramètre de la chaîne d'exécution est le nom du paramètre tvp (mergeoncolumn) qui est rempli avec le tvp.

vous pouvez éventuellement ajouter le statut du résultat ou le nombre de lignes comme décrit dans la documentation pytds :https://python-tds.readthedocs.io/en/latest/index.html

Remarque !  :dans la procédure stockée, vous devez vous assurer que SET NOCOUNT ON est ajouté, sinon vous n'obtiendrez aucun résultat vers Python