这不是一个问题,而是一个先发制人的答案。 (我从这个网站得到了很多帮助,并想要回馈。)
当我尝试使用pymssql通过python运行它时,我正在努力处理大量的SQL查询,但直接通过MS SQL运行时会运行正常。 (例如,就我而言,我使用MS SQL Server Management Studio在python之外运行它。)
然后我终于发现了问题:pymssql无法处理临时表。至少不是我的版本,仍然是1.0.1。
作为证据,这里是我的代码片段,略有改动以保护任何IP问题:
conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
database=sqlDB)
cur = conn.cursor()
cur.execute(testQuery)
以上代码FAILS(如果我使用pymssql.OperationalError: No data available.
调用它,则返回没有数据,具体而言,如果您致电cur.fetchone()
则会发出错误“testQuery
”):
testQuery = """
CREATE TABLE #TEST (
[sample_id] varchar (256)
,[blah] varchar (256) )
INSERT INTO #TEST
SELECT DISTINCT
[sample_id]
,[blah]
FROM [myTableOI]
WHERE [Shipment Type] in ('test')
SELECT * FROM #TEST
"""
但是,如果testQuery
定义如下,它可以正常工作。
testQuery = """
SELECT DISTINCT
[sample_id]
,[blah]
FROM [myTableOI]
WHERE [Shipment Type] in ('test')
"""
我在Stack Overflow中进行了Google搜索以及搜索,但无法找到有关特定问题的任何信息。我还查看了在http://code.google.com/p/pymssql/wiki/FAQ
找到的pymssql文档和FAQ,并没有看到任何提及不允许临时表的内容。所以我想我会加上这个“问题”。
答案 0 :(得分:2)
更新:2016年7月
之前接受的答案已不再有效。第二个"将不起作用"示例确实可以在Python 2.7.11下使用pymssql 2.1.1(一次conn.autocommit(1)
替换为conn.autocommit(True)
以避免" TypeError:无法将int转换为bool")。
答案 1 :(得分:1)
对于那些遇到这个问题但可能有类似问题的人,我想我会传递自原帖以来我学到的东西。事实证明,您可以在pymssql
中使用临时表,但是您必须非常小心处理提交。
我首先通过例子解释。以下代码将起作用:
testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )
INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)
"""
conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
cur.execute("SELECT * FROM #TEST")
tmp = cur.fetchone()
tmp
然后返回第一个项目(后续提取将返回另一个项目):
('Mike', 12)
但以下内容不起作用
testQuery = """
CREATE TABLE #TEST (
[name] varchar(256)
,[age] int )
INSERT INTO #TEST
values ('Mike', 12)
,('someone else', 904)
SELECT * FROM #TEST
"""
conn = pymssql.connect(host=sqlServer, user=sqlID, password=sqlPwd, \
database=sqlDB) ## obviously setting up proper variables here...
conn.autocommit(1)
cur = conn.cursor()
cur.execute(testQuery)
tmp = cur.fetchone()
tmp
这将失败说“pymssql.OperationalError: No data available.
”我最明白的原因是,无论您是否自动提交,以及您是否专门自行提交,都必须明确创建所有表在尝试阅读之前提交并承诺。
在第一种情况下,您会注意到有两个“cur.execute(...)
”来电。第一个创建临时表。完成“cur.execute()
”后,自启用自动提交后,将提交SQL脚本,生成临时表。然后调用另一个cur.execute()
来从该表中读取。在第二种情况下,我试图创建&从表中“同时”读取(至少在pymssql
的脑海中...它在MS SQL Server Management Studio中正常工作)。由于该表先前未制作过&承诺,我无法查询。