sql >> Databáze >  >> RDS >> Sqlserver

Python volání sql-server uložené procedury s tabulkovým parametrem

Na základě připomínek k mé otázce se mi podařilo spustit uloženou proceduru s parametry s hodnotou tabulky (a získat návratové hodnoty z SP) Finální skript je následující:

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 je přidán do připojení (pro potvrzení transakce v kurzoru), parametr s hodnotou tabulky (marchcolumntable) očekává 2 sloupce, takže arg je upraven tak, aby se vešel do 2 sloupců.

Parametry, které jsou vyžadovány kromě tvp, jsou zahrnuty v řetězci exec. Posledním parametrem ve spouštěcím řetězci je název parametru tvp (mergeoncolumn), který je vyplněn hodnotou tvp.

volitelně můžete přidat stav výsledku nebo počet řádků, jak je popsáno v dokumentaci pytds:https://python-tds.readthedocs.io/en/latest/index.html

Poznámka! :v uložené proceduře se musíte ujistit, že je přidáno SET NOCOUNT ON, jinak nedostanete žádné výsledky zpět do Pythonu



  1. Vytvořte schéma PostgreSQL

  2. Způsoby nastavení parametrů NLS a jejich priorit (databáze Oracle)

  3. Celočíselné pole MySQL je v PHP vráceno jako řetězec

  4. Vysvětlete podrobněji návrh výkonu JOIN vs. LEFT JOIN a WHERE