Python 使用pyodbc、存储过程和SQL Server执行
我希望知道诊断此错误的最简单方法是什么,因为通过pyodbc显示正在执行的SQL似乎并不容易 我的存储过程如下所示:Python 使用pyodbc、存储过程和SQL Server执行,python,sql-server,stored-procedures,pyodbc,Python,Sql Server,Stored Procedures,Pyodbc,我希望知道诊断此错误的最简单方法是什么,因为通过pyodbc显示正在执行的SQL似乎并不容易 我的存储过程如下所示: ALTER PROCEDURE [dbo].[s_populate_Test_sp] @TestDateTime DATETIME, @TestInt INT, @TestMoney MONEY, @TestVarChar500 VARCHAR(500), @TestFloat FLOAT AS SET NOCOUNT
ALTER PROCEDURE [dbo].[s_populate_Test_sp]
@TestDateTime DATETIME,
@TestInt INT,
@TestMoney MONEY,
@TestVarChar500 VARCHAR(500),
@TestFloat FLOAT
AS
SET NOCOUNT ON
INSERT INTO [dbo].[tbl_Test_sp2] (test_datetime, test_int, test_money, test_varchar500, test_float)
VALUES (@TestDateTime, @TestInt, @TestMoney, @TestVarChar500, @TestFloat)
我可以使用原始文本(下面的注释代码)成功执行此存储过程一次,但在执行方面遇到困难:
import os
import pyodbc
import datetime
def test_sp():
# Constants
dir_path = os.path.dirname(os.path.realpath(__file__))
# Connect
server = 'xxx'
db2 = 'xxx'
conn_str = 'DRIVER={SQL Server};SERVER=' + server + \
';DATABASE=' + db2 + ';Trusted_Connection=yes'
conn=pyodbc.connect(conn_str, autocommit=False)
cursor = conn.cursor()
cursor.fast_executemany = True
for row in range(10000):
# sql = '''EXEC [dbo].[s_populate_Test_sp] @TestDateTime = '2020-01-01 13:00',
# @TestInt = 999,
# @TestMoney = '£12.34',
# @TestVarChar500 = 'Hello My Name is Jon',
# @TestFloat = 1.234567
# '''
# cursor.execute(sql)
sql = '''exec s_populate_Test_sp (@TestDateTime = ?, @TestInt = ?, @TestMoney = ?, @TestVarChar500 = ?, @TestFloat = ?)'''
values = ['2020-01-01 13:00', 999, '£12.34', 'Hello My Name is Jon', 1.234567]
cursor.executemany(sql, [values])
conn.commit()
if __name__ == '__main__':
test_sp()
不幸的是,这会产生一个相当隐晦的错误消息:
编程错误:('42000',“[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]在“@TestDateTime.”(102)(SQLExecute)附近的语法不正确;[42000][Microsoft][ODBC SQL Server驱动程序][SQL Server]语句无法准备。(8180)”
在执行SQL之前,我找不到一种显示SQL的方法,所以目前这一切都是一些尝试和错误
非常感谢根据评论,答案是删除括号、符号并使用datetime.datetime对象:
sql = '''exec s_populate_Test_sp @TestDateTime = ?, @TestInt = ?, @TestMoney = ?, @TestVarChar500 = ?, @TestFloat = ?'''
values = [datetime.datetime.now(), 999, 12.34, 'Hello My Name is Jon', 1.234567]
速度如此之慢令人沮丧。通过我公司的VPN,它每分钟可以做400条记录,在靠近服务器的虚拟机上,它每分钟可以做9000条记录。我怀疑这是pyodbc和SQL Server的局限性之一,对于较大的数据集,我必须执行bcp或类似的操作。您是否注意到有效代码和无效代码之间的差异?我知道
@TestDateTime
vs.(@TestDateTime
。谢谢。删除括号后,我得到:DataError:('22018','[22018][Microsoft][ODBC SQL Server Driver]转换规范(0)(SQLExecute)'的字符值无效)
我当时认为它可能是符号,所以我删除了它。仍然得到了错误。我们将进一步调查。建议使用标准且明确的日期时间格式,或者yyyymmdd hh:mm:ss
或者yyyy-mm-ddThh:mm:ss
。还可能检查tbl\u Test\u sp2
是否有触发器。解决了它,谢谢-如果我使用datetime.datetime对象,并删除该对象,以确保其正常工作