【发布时间】:2021-11-20 12:27:51
【问题描述】:
我正在尝试使用 pymssql 库在 SQL Server 中执行多个查询。
这是我的代码:
cur = conn.cursor()
cur.execute("DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
SET @begin_time = DATEADD(day, -1, GETDATE()) ;
SET @end_time = GETDATE();
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_users(@from_lsn, @to_lsn, 'all');")
output = cur.fetchall()
print(output)
conn.close()
代码运行良好并获取结果,但是当我使用 Python 库计算日期并将其传递给代码时,出现错误。
示例代码
from datetime import datetime, timedelta
end_date = datetime.now()
start_date = datetime.now() + timedelta(hours=-1)
cur = conn.cursor()
query = f"""DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
SET @begin_time = {start_date};
SET @end_time = {end_date};
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than or equal', @begin_time);
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_users (@from_lsn, @to_lsn, 'all');"""
print(query)
cur.execute(query)
output = cur.fetchall()
print(output)
conn.close()
错误:
ProgrammingError:(102,'11' 附近的语法不正确。
DB-Lib 错误消息 20018,严重性 15:
常规 SQL Server 错误:检查来自 SQL Server 的消息
我不确定我在这里做错了什么。如果有人可以帮助我并解释问题,我将不胜感激。
【问题讨论】:
-
错误信息显示其语法不正确
-
这就是我无法弄清楚我在哪里得到错误语法的原因,因为当我使用 sql 查询计算时间时,相同的查询工作正常。
-
这可能是因为 dateformat 被传递给 sql server 块的方式。你能以 YYYY-MM-DD hh24:mi:ss 格式传递 start_time
-
我试过了,但没用 :(
-
当您打印查询时,您的日期值是否包含在
'字符中?您可以尝试使用Binding Parameters 来确保它们得到正确处理。
标签: python sql-server pymssql