0

这不是一个问题,而是一个先发制人的答案。(我从这个网站得到了很多帮助并想回馈。)

当我尝试使用 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)

上面的代码失败(具体来说,不返回任何数据,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')

"""

我进行了 Google 搜索以及 Stack Overflow 中的搜索,但找不到有关特定问题的任何信息。我还查看了位于 的 pymssql 文档和常见问题解答, http://code.google.com/p/pymssql/wiki/FAQ但没有看到任何提及不允许使用临时表的内容。所以我想我会添加这个“问题”。

4

2 回答 2

2

更新:2016 年 7 月

先前接受的答案不再有效。第二个“将不工作”示例确实适用于 Python 2.7.11 下的 pymssql 2.1.1(曾经conn.autocommit(1)被替换为conn.autocommit(True)以避免“TypeError:无法将 int 转换为 bool”)。

于 2016-07-23T14:05:41.017 回答
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

这将返回第一个项目(随后的 fetch 将返回另一个):

('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 中工作正常)。由于该表之前尚未制作和提交,因此我无法对其进行查询。

哇...发现这很麻烦,调整我的代码(最初在 MS SQL Server Management Studio 上开发)以使其在脚本中工作也很麻烦。那好吧...

于 2012-01-13T00:48:55.917 回答