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

Python kalder sql-server lagret procedure med tabelværdiparameter

På baggrund af kommentarerne til mit spørgsmål er det lykkedes mig at få den lagrede procedure til at køre med tabelværdiparametre (og få returværdierne fra SP) Det endelige script er som følger:

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 tilføjes i forbindelsen (for at udføre transaktionen i markøren), parameteren med tabelværdi (marchcolumntable) forventer 2 kolonner, så arg er modificeret til at passe til 2 kolonner.

De parametre, der kræves udover tvp, er inkluderet i exec-strengen. Den sidste param i execute-strengen er navnet på tvp-parameteren(mergeoncolumn), der er udfyldt med tvp.

valgfrit kan du tilføje resultatstatus eller rækkeantal som beskrevet i pytds-dokumentationen:https://python-tds.readthedocs.io/en/latest/index.html

Bemærk! :i den lagrede procedure skal du sørge for, at SET NOCOUNT ON er tilføjet, ellers får du ingen resultater tilbage til Python



  1. En guide til PubNub-funktioner

  2. Oracle Aldersberegning fra fødselsdato og i dag

  3. Sådan eksporteres tabel til CSV ved hjælp af Oracle SQL Developer?

  4. MySQL (eller PHP?) grupperer resultater efter feltdata