【发布时间】: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,但我只是好奇为什么这不起作用。
有什么想法吗?
【问题讨论】:
-
您的
scope_identity是only statement in the batch(这是范围)。你需要put it into the recordset query batch。 -
SQL Server 是 Microsoft 提供的关系型数据库 产品 - 而 T-SQL (Transact-SQL) 是SQL Server(任何 Sybase)使用的 SQL(查询)语言的“方言”
标签: sql-server vba tsql