sql >> Database >  >> RDS >> Sqlserver

Python call sql-server opgeslagen procedure met tabelwaardeparameter

Op basis van de opmerkingen op mijn vraag ben ik erin geslaagd om de opgeslagen procedure te laten werken met tabelwaardeparameters (en de geretourneerde waarden van de SP te krijgen) Het uiteindelijke script is als volgt:

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)

De autocommit wordt toegevoegd in de verbinding (om de transactie in de cursor vast te leggen), de tabelwaardeparameter (marchcolumntable) verwacht 2 kolommen, dus de arg wordt aangepast om op 2 kolommen te passen.

De parameters die naast de tvp nodig zijn, zijn opgenomen in de exec-string. De laatste parameter in de execute-string is de naam van de tvp-parameter (mergeoncolumn) die is gevuld met de tvp.

optioneel kunt u de resultaatstatus of het aantal rijen toevoegen zoals beschreven in de pytds-documentatie:https://python-tds.readthedocs.io/en/latest/index.html

Opmerking! :in de opgeslagen procedure moet je ervoor zorgen dat de SET NOCOUNT ON is toegevoegd, anders krijg je geen resultaten terug naar Python



  1. Een kop- en voettekst toevoegen aan een rapport in Microsoft Access

  2. Een gids voor MySQL Galera Cluster Streaming Replicatie:deel twee

  3. Wat doet het dubbele teken :in een SQL-query?

  4. Dubbele records zoeken in MySQL