【问题标题】:No Results from pyodbc using table type使用表类型的 pyodbc 没有结果
【发布时间】:2015-03-04 17:16:58
【问题描述】:

我正在此连接中创建一个#Temp 表,然后尝试将其转换为用户定义的表类型并将其传递给存储过程。这在 Microsoft SQL Server Management Studio 中运行良好,但我无法使用 pyodbc 在 python 中运行。

SET NOCOUNT ON;
USE TestDB
DECLARE @Temp as dbo.TempType;
INSERT INTO @Temp SELECT * FROM #Temp;
SELECT * FROM @Temp;

(在实际代码中,最后的 select 语句将是存储过程,但在测试中我试图让它工作)。尝试在游标上执行 fetchall 返回:

Traceback (most recent call last):
  File "C:\Anaconda\lib\site-packages\IPython\core\interactiveshell.py", line 2883, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-237-dfc0750240b3>", line 1, in <module>
    dt = cur.fetchall()
ProgrammingError: No results.  Previous SQL was not a query.

在同一个连接中,我可以 SELECT * FROM #Temp 就好了——但转换为表类型似乎不允许我选择。有什么想法吗?

【问题讨论】:

  • 我不太使用 pyodbc,但一个可能的原因是您需要在 INSERT 语句之后的连接上执行.commit(),然后才能执行 SELECT 语句。
  • 我无法重现您的问题。如果您想自己尝试一下,我已经粘贴了我的测试代码here
  • 我不知道如果它是在 SP 之外创建的,我可以在 SP 中使用 #Temp 表——现在我完全摆脱了表类型,因为我需要它的唯一原因(或这么认为)是将临时表传递给 SP。我认为你在 SP 中声明 @Temp 并填充它对我有用,因为现在服务器正在运行,所以我会在下周尝试,尽管在 SP 中使用 #Temp 是可行的,所以我我准备好了——谢谢!

标签: python sql-server ssms pyodbc


【解决方案1】:

不确定这是否有帮助,但它解决了我在使用 iPython 笔记本和 pyodbc#temp 表时遇到的问题:

import pyodbc
con = pyodbc.connect('Driver={SQL Server Native Client 10.0};Server=somedatabaseserver.com;Database=SomeDB;Trusted_Connection=yes;')
cur = con.cursor()

query1 = """SELECT * into #temp FROM [SomeDB].[SomeTable]"""
query2 = """SELECT * FROM #temp"""

cur.execute(query1)
cur.commit()
cur.execute(query2).fetchall()

这里的技巧是将提交到#temp查询中,然后针对它执行工作。

【讨论】:

  • 不确定您是否会看到我的评论。但是我遇到了一种情况,我必须创建 2 个以上的本地临时表。似乎只有只有一个本地临时表时,提交方法才有效。当有多个时,似乎只有当我将后续的本地临时表更改为全局临时表时, commit() 才会起作用。我想知道你是否知道为什么会这样。我的问题也与这篇文章有关:stackoverflow.com/questions/37863125/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多