sql >> Databasteknik >  >> RDS >> Sqlserver

Python-anrop sql-server lagrad procedur med tabellvärderad parameter

På grundval av kommentarerna till min fråga har jag lyckats få igång den lagrade proceduren med tabellvärderade parametrar (och hämta returvärdena från SP) Det slutliga skriptet är som följer:

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 läggs till i anslutningen (för att utföra transaktionen i markören), parametern med tabellvärde (marchcolumntable) förväntar sig 2 kolumner, så arg är modifierad för att passa 2 kolumner.

Parametrarna som krävs förutom tvp ingår i exec-strängen. Den sista parametern i exekveringssträngen är namnet på tvp-parametern (mergeoncolumn) som är fylld med tvp.

valfritt kan du lägga till resultatstatus eller radantal enligt beskrivningen i pytds-dokumentationen:https://python-tds.readthedocs.io/en/latest/index.html

Obs! :i den lagrade proceduren måste du se till att SET NOCOUNT ON läggs till annars får du inga resultat tillbaka till Python



  1. Vad är MariaDB? Hur fungerar MariaDB?

  2. SQL Server Parallell Backup Restore -2

  3. PostgreSQL – Hur man eliminerar upprepade värden

  4. Wordpress Fatalt fel:Oupptäckt fel:Anrop till odefinierad funktion mysql_connect() i /wp-includes/wp-db.php:1570