使用pyodbc、存储过程和SQL Server执行



我很高兴知道诊断此错误的最简单方法是什么,因为通过pyodbc显示正在执行的SQL似乎并不容易。

我的存储过程如下:

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()

不幸的是,这产生了一个相当神秘的错误消息:

ProgrammingError:('42000',"[42000][Microsoft][ODBC SQL Server Driver][SQL Server]'@TestDateTime'附近的语法不正确。(102((SQLExecute(;[42000][Microsoft][ODBC SQL Server Driver][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或类似的操作。

相关内容

  • 没有找到相关文章

最新更新