【发布时间】:2019-01-26 13:02:04
【问题描述】:
我有一个加载、转换和计算数据的 python 脚本。在 sql-server 中有一个存储过程,它需要一个表值参数、2 个必需参数和 2 个可选参数。在 sql server 中我可以调用这个 SP:
USE [InstName]
GO
DECLARE @return_value int
DECLARE @MergeOnColumn core.MatchColumnTable
INSERT INTO @MergeOnColumn
SELECT 'foo.ExternalInput','bar.ExternalInput'
EXEC @return_value = [core].[_TableData]
@Target = N'[dbname].[tablename1]',
@Source = N'[dbname].[table2]',
@MergeOnColumn = @MergeOnColumn,
@Opt1Param = False,
@Opt2Param = False
SELECT 'Return Value' = @return_value
GO
经过全面搜索,我找到了以下帖子:
How to call stored procedure with SQLAlchemy that requires a user-defined-type Table parameter
它建议使用 PYTDS 和 sql-alchemy 的方言“sql alchemy pytds”来调用带有表值参数的 SP。 通过这篇文章和文档,我创建了以下 Python 脚本:
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', 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="MergeOnColumn", rows=(arg))
cur.execute('EXEC test_proc %s', ("[dbname].[table2]", "[dbname].[table1]", tvp,))
cur.fetchall()
当我运行此代码时,我收到以下错误消息:
TypeError: not all arguments converted during string formatting
有谁知道如何正确传递多个参数或建议我如何直接处理这个调用 SP?
【问题讨论】:
-
什么版本的 SQL Server?此外,您始终可以像在第一个代码块中引用的那样运行完整的批处理,而不是从客户端绑定 TVP。
-
错误是传递一个三元组作为参数序列的结果,但查询中只有一个占位符。快速浏览一下,您不应该有
type_name="MatchColumnTable"之类的吗?同样rows=(arg)仅传递arg,而不是行序列,因为它是构成元组的逗号:rows=(arg,)(或者使用元组列表)。你的缩进也有点偏离。其余的不清楚。 -
@IljaEverilä 感谢您的提示并帮助我朝着正确的方向前进。我已经设法让脚本正常工作,我会在下面添加它作为答案
标签: python sql-server sqlalchemy table-valued-parameters python-db-api