Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pymssql(python模块)无法使用临时表_Python_Pymssql - Fatal编程技术网

pymssql(python模块)无法使用临时表

pymssql(python模块)无法使用临时表,python,pymssql,Python,Pymssql,这不是一个问题,而是一个先发制人的答案。(我从这个网站得到了很多帮助,我想回馈。) 当我尝试使用pymssql通过python运行SQL查询时,遇到了一个很大的SQL查询失败,但是直接通过mssql运行会很好。(例如,在我的例子中,我使用MS SQL Server Management Studio在python之外运行它。) 然后我终于发现了问题:pymssql无法处理临时表。至少不是我的版本,它仍然是1.0.1 作为证明,以下是我的代码片段,稍作修改以保护任何IP问题: conn = pym

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

当我尝试使用pymssql通过python运行SQL查询时,遇到了一个很大的SQL查询失败,但是直接通过mssql运行会很好。(例如,在我的例子中,我使用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)
如果调用
cur.fetchone()
),则上述代码失败(具体而言,不返回任何数据,并抛出错误“
pymssql.OperationalError:无可用数据。
”,如果我使用定义如下的
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')

"""

我做了谷歌搜索和堆栈溢出搜索,但找不到关于特定问题的任何信息。我还查看了pymssql文档和常见问题,可在
http://code.google.com/p/pymssql/wiki/FAQ
,没有看到任何提到不允许使用临时表的内容。所以我想我应该加上这个“问题”。

对于那些遇到这个问题并且可能有类似问题的人,我想我应该把我从最初的帖子中学到的东西传递给他们。事实证明,您可以在
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
然后将返回第一个项目(后续提取将返回另一个项目):

但以下方法行不通

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:没有可用的数据,
”这将失败。我能说的最好的原因是,无论您是否启用了自动提交,无论您是否明确自己进行了提交,在尝试从表中读取之前,都必须显式地创建和提交所有表

在第一种情况下,您会注意到有两个“
cur.execute(…)
”调用。第一个创建临时表。在完成“
cur.execute()
”后,由于自动提交已打开,SQL脚本已提交,因此创建临时表。然后调用另一个
cur.execute()
从该表中读取。在第二种情况下,我尝试“同时”创建和读取表(至少在
pymssql
的头脑中是这样的……它在mssqlservermanagementstudio中工作得很好)。由于该表之前尚未生成和提交,因此我无法查询它


哇。。。这是一个很难发现的问题,调整我的代码(最初是在MSSQLServerManagementStudio上开发的)以使其在脚本中工作也是一个难题。哦,好吧…

对于那些遇到这个问题并可能有类似问题的人,我想我应该把从最初的帖子中学到的东西传递给他们。事实证明,您可以在
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
然后将返回第一个项目(后续提取将返回另一个项目):

但以下方法行不通

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:没有可用的数据,
”这将失败。我能说的最好的原因是,无论您是否启用了自动提交,无论您是否明确自己进行了提交,在尝试从表中读取之前,都必须显式地创建和提交所有表

在第一种情况下,您会注意到有两个“
cur.execute(…)
”调用。第一个创建临时表。在完成“
cur.execute()
”后,由于自动提交已打开,SQL脚本已提交,因此创建临时表。然后调用另一个
cur.execute()
从该表中读取。在第二种情况下,我尝试“同时”创建和读取表(至少在
pymssql
的头脑中是这样的……它在mssqlservermanagementstudio中工作得很好)。由于该表之前尚未生成和提交,因此我无法查询它

哇。。。这是一个很难发现的问题,调整我的代码(最初是在MSSQLServerManagementStudio上开发的)以使其在脚本中工作也是一个难题。哦……更新:2016年7月

以前接受的答案不再有效。第二个“将不起作用”示例确实适用于Python 2.7.11下的pymssql 2.1.1(一旦
conn.autocommit(1)
替换为
conn.autocommit(True)
,以避免“类型错误:无法将int转换为bool”)

更新日期:2016年7月


以前接受的答案不再有效。第二个“将不起作用”示例确实适用于Python 2.7.11下的pymssql 2.1.1(一旦
conn.autocommit(1)
替换为
conn.autocommit(True)
,以避免“类型错误:无法将int转换为bool”)

您好@gord thompson,谢谢您的更新!我会留下我的旧答案,简单的b/c它有更多的细节,但我现在已经接受了你的正式答案。嗨@gord thompson,谢谢你的更新!我会留下我的旧答案,简单的b/c,它有更多的细节,但我现在已经接受你的正式答案。