Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Python chama o procedimento armazenado do sql-server com parâmetro com valor de tabela


Com base nos comentários à minha pergunta, consegui executar o procedimento armazenado com parâmetros com valor de tabela (e obter os valores de retorno do SP) O script final é o seguinte:
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)

O autocommit é adicionado na conexão (para confirmar a transação no cursor), o parâmetro com valor de tabela (marchcolumntable) espera 2 colunas, então o argumento é modificado para caber em 2 colunas.

Os parâmetros necessários além do tvp estão incluídos na string exec. O último parâmetro na string de execução é o nome do parâmetro tvp (mergeoncolumn) que é preenchido com o tvp.

opcionalmente, você pode adicionar o status do resultado ou a contagem de linhas conforme descrito na documentação do pytds:https://python-tds.readthedocs.io/en/latest/index.html

Observação! :no procedimento armazenado, você deve garantir que o SET NOCOUNT ON seja adicionado, caso contrário, você não obterá nenhum resultado de volta ao Python