如何使用插入时获取标识值..输出与 pyodbc



我正在尝试使用 OUTPUT 获取新插入行的 ID。但是,我遇到了HY010错误。以下查询/代码是我使用的:

string = """
         SET NOCOUNT ON;
         DECLARE @NEWID TABLE(ID INT);
         INSERT INTO dbo.t1 (Username, Age)
         OUTPUT inserted.id INTO @NEWID(ID)
         VALUES(?, ?)
         SELECT ID FROM @NEWID
         """
cursor.execute(string, "John Doe", 35)
cursor.commit()
id = cursor.fetchone()[0]

最后一行id = cursor.fetchone()[0]导致 HY010 错误(见下文)。任何建议将不胜感激!

pyodbc.Error: ('HY010', '[HY010] [Microsoft][ODBC SQL Server Driver]Function sequence error (0) (SQLFetch)')

我能够重现您的问题,并且能够通过在插入之后和提交之前立即检索id值来避免它。也就是说,而不是

cursor.execute(string, "John Doe", 35)
cursor.commit()
id = cursor.fetchone()[0]

我做了

cursor.execute(string, "John Doe", 35)
id = cursor.fetchone()[0]  # although cursor.fetchval() would be preferred
cursor.commit()
对我来说

,这仅适用于Azure SQL Serverless(使用pyodbc==4.0.28):

cursor.execute(insert_statement, param_value_list)
cursor.execute("SELECT @@IDENTITY AS ID;")
return cursor.fetchone()[0]
如果您

将 SQLAlchemy 与 engine 一起使用,则可以在运行查询并获取表 ID 之前像这样检索 PyODBC 游标。

    connection = sql_alchemy_engine.raw_connection()
    cursor = connection.cursor()
    result = cursor.execute(
        """
        INSERT INTO MySchema.MyTable (Col1, Col2) OUTPUT INSERTED.MyTableId 
        VALUES (?, ?);
        """,
        col1_value,
        col2_value,
    )
    myTableId = cursor.fetchone()[0]
    cursor.commit()
    print("my ID is:", myTableId)

对于正在谷歌搜索如何查找最新的自动生成的 ID 的其他人,但由于某种原因它不起作用或像使用 Azure SQL 为我所做的那样返回 None 。让它自动生成 ID 然后检索它的另一种解决方案是使用 Python (https://docs.python.org/3/library/uuid.html) 中的 uuid 模块并自己生成一个 ID,然后使用它插入。

import uuid
row_id = uuid.uuid4()
cursor.execute(f"INSERT INTO Person(ID,name) VALUES ({row_id}, 'Graham Smith')")

相关内容

  • 没有找到相关文章

最新更新