python - 如何通过 QSqlQuery.lastInsertId() 从 SQL Server 获取最后插入行的 ID?

标签 python sql-server tsql pyqt

如何通过 PyQt4.QtSql 模块从 SQL Server 获取最后插入行的 ID?现在我使用的是 SQL Server 2012 Express,但程序也必须在 SQL Server 2000 上运行。

这是我的代码(Python + PyQt)和结果:

from PyQt4.QtGui import QApplication
from PyQt4 import QtSql

app = QApplication([])
db = QtSql.QSqlDatabase.addDatabase("QODBC")
db.setDatabaseName('Driver={SQL Server Native Client 11.0};Server=(localdb)\\v11.0;')
db.open()

query = QtSql.QSqlQuery()
query.prepare("""CREATE TABLE Test(
    ID INT PRIMARY KEY IDENTITY(1, 1),
    Row nvarchar(255)
)
""")
query.exec_()

query = QtSql.QSqlQuery()
query.prepare('INSERT Test OUTPUT Inserted.ID VALUES(?)')
query.bindValue(0, 'Test')

query.exec_()

while query.next():
    last_inserted_id = query.value(0)

print('OUTPUT: ', last_inserted_id)
print('QSqlQuery.lastInsertId: ', query.lastInsertId())

query = QtSql.QSqlQuery('SELECT SCOPE_IDENTITY()')

while query.next():
    last_inserted_id_ = query.value(0)

print('SCOPE_IDENTITY: ', last_inserted_id_)

db.close()

结果:

OUTPUT:  1
QSqlQuery.lastInsertId:  None
SCOPE_IDENTITY:  <PyQt4.QtCore.QPyNullVariant object at 0x00000000032D88D0>

不幸的是,OUTPUT 子句受 SQL Server 2005 或更高版本支持。

Python 3.2.3 (x64)、PyQt 4.9.4、SQL Server 2012 Express

有什么想法吗?

编辑:

到目前为止,我使用SELECT @@IDENTITY

最佳答案

将我的评论移至答案,以便彻底关闭此问题:

我不懂Python,但我认为SCOPE_IDENTITY()只能在批处理中工作。因此,您可能需要将 ;SELECT SCOPE_IDENTITY() 添加到带有 INSERT 的查询中。希望这会有所帮助。

因此您的插入内容可能如下所示:

query = QtSql.QSqlQuery() 
query.prepare('INSERT Test VALUES(?); SELECT SCOPE_IDENTITY()') 
query.bindValue(0, 'Test') 

query.exec_() 

while query.next(): 
    last_inserted_id = query.value(0) 

关于python - 如何通过 QSqlQuery.lastInsertId() 从 SQL Server 获取最后插入行的 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11601281/

相关文章:

python - 加速用户定义的函数

sql - 查询 SSRS 数据集中的 View 与表

sql-server - T-SQL : How to update just date part of datetime field?

Python 与代码一起定义单元测试类

python - 在 Python 中调整图像大小

SQL Server 2008 - 默认列值 - 我应该使用 null 还是空字符串?

sql - 从存储过程中的表中返回所有 ID

tsql - SQL 中的 IDENTITY() 函数

python - 如何在不调用 `np.vectorize` 的情况下强制广播函数

sql-server - 如何更改 SQL Server 2008 中现有表的列顺序