【问题标题】:T-SQL - SELECT SCOPE_IDENTITY does not work in vba codeT-SQL - SELECT SCOPE_IDENTITY 在 vba 代码中不起作用
【发布时间】:2019-07-17 06:55:46
【问题描述】:

我正在开展一个项目,该项目包括将数千个 Excel 行传输到 SQL Server(如果我是对的,它也称为 T-SQL?)数据库。我在 VBA 中整理了一些逻辑来构建数据。

让我先给你一些关于这个的背景。我要传输的数据是发票文件。每行都有库存项目代码、价格、发票编号、发票日期、客户名称等。这些需要传输到专有 ERP 系统的数据库中。

我现在感兴趣的数据库中有两个表。第一个保存发票的标题数据(客户数据、日期、发票编号、发票总额等)。第二个表包含有关库存项目的信息(已售出什么,有多少和多少钱等)。

每次插入第一张表后,我必须获取插入行的主键,以便向第二张表插入行,这需要第一张表在每一行上的 PK。

现在,我的方法是使用 T-SQL 的 SCOPE_IDENTITY() 函数。当我尝试通过 SQL Server Management Studio 直接在数据库上执行此操作时,它可以顺利运行。

但是当我尝试在代码中使用它时,它返回一个空记录集。

我使用的代码如下:

Public Function Execute(query As String, Optional is_batch As Boolean = False) As ADODB.Recordset

    If conn.State = 0 Then
        OpenConnection
    End If

    Set rs = conn.Execute(query) 'this is the actual query to be executed

    Dim identity As ADODB.Recordset 'this rs supposed to hold the PK of inserted row, but returns an empty recordset

    Set identity = conn.Execute("SELECT SCOPE_IDENTITY();")

    If TypeName(identity.Fields(0).Value) = "Null" Then
        pInsertedId = -1
    Else
        pInsertedId = identity.Fields(0).Value 'I'm saving it in an object variable, to access it easily later on
    End If

    Set Execute = rs 'to be returned to the caller

    'closing the connection is handled outside this procedure

End Function

当我在 VBA 上运行它时,第二个查询 SELECT SCOPE_IDENTITY();just 返回一个空记录集。直接在数据库上运行时,相同的查询可以成功运行。

实际上,我可以通过其他方式解决这个问题。我应该将一个 UUID 列插入到第一个表的行中。我可以简单地用这个 UUID 查询表并获取 PK,但我只是好奇为什么这不起作用。

有什么想法吗?

【问题讨论】:

标签: sql-server vba tsql


【解决方案1】:

您的代码没有插入任何数据,因此在当前范围内不会生成任何标识值,如SCOPE_IDENTITY() 的官方文档中所定义:

返回插入到同一范围内的标识列中的最后一个标识值。范围是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句在同一个存储过程、函数或批处理中,它们就在同一个作用域中。

您的代码实际上与在 SSMS 的一个查询窗口中插入数据并在另一个查询窗口中查询 SCOPE_IDENTITY() 相同。好吧,这不是它的工作方式。您必须在同一范围内查询它,即存储过程、触发器、函数或批处理。否则,请使用您生成的 ID 值并将它们与数据一起插入。

【讨论】:

  • 好的,现在可以了。我记得在某处读到,只要查询在同一个连接中,SCOPE_IDENTITY() 应该可以工作,但显然不行。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
相关资源
最近更新 更多