我编写了这段代码来删除表中的重复项。在中执行时,它工作得很好,但我无法让它与Python一起执行。
没有错误发生,只是不起作用.我也尝试过执行其他查询,没有任何问题。
有人想出什么事了吗?我正在使用Python2.7
import pymssql
import time
conn = pymssql.connect(server='rfhete755', database='EEX')
c = conn.cursor()
p = """
SELECT [ID]
,[Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar];
WITH CTE
AS (
SELECT [Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar]
)
DELETE
FROM CTE
WHERE Rnum <> 1"""
print p
c.execute(p)
time.sleep(2)
conn.commit()
time.sleep(1)
c.close()
conn.close()发布于 2015-12-10 11:32:07
cursor.execute()可以执行一条语句。您正在传递多个语句。将操作拆分为单独的cursor.execute()调用:
select_all = """
SELECT [ID]
,[Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar]"""
c.execute(select_all)
delete_all_but_first = """
WITH CTE
AS (
SELECT [Operator]
,[Source]
,[Timestamp]
,ROW_NUMBER() OVER (
PARTITION BY [Operator]
,[Source]
,[Timestamp] ORDER BY [Timestamp]
) AS Rnum
FROM [EEX].[dbo].[Wind_Solar]
)
DELETE
FROM CTE
WHERE Rnum <> 1"""
c.execute(delete_all_but_first)很可能您并不打算包含第一个SELECT。
我不知道为什么在Python代码中使用time.sleep()语句,不需要这些语句来确保正确的执行。
如果您使用连接对象和游标作为上下文管理器,它们将自动关闭(不幸的是,pymmsql项目错过了在其上下文管理器实现中包含事务处理的机会):
with pymssql.connect(server='rfhete755', database='EEX') as conn:
with conn.cursor() as c:
c.execute(delete_all_but_first)
conn.commit()https://stackoverflow.com/questions/34200725
复制相似问题