Sql server T-SQL-选择范围\u标识在vba代码中不起作用
我正在从事一个项目,该项目包括将数千行Excel数据传输到SQL Server(如果我是对的话,也称为T-SQL)数据库。我在VBA中整合了一些逻辑以形成数据 让我先给你讲一下这方面的情况。我要传输的数据是发票文件。每行都有库存项目代码、价格、发票编号、发票日期、客户名称等。这些需要传输到专有ERP系统的数据库中 数据库中有两个表我现在感兴趣。第一个保存发票的标题数据(客户数据、日期、发票号、发票总额等)。第二个表包含库存项目的信息(已售出的商品、数量和金额等) 每次插入第一个表之后,我必须获取插入行的主键,以便将行插入第二个表,这需要每行上第一个表的主键 现在,我的方法是使用T-SQL的Sql server T-SQL-选择范围\u标识在vba代码中不起作用,sql-server,vba,tsql,Sql Server,Vba,Tsql,我正在从事一个项目,该项目包括将数千行Excel数据传输到SQL Server(如果我是对的话,也称为T-SQL)数据库。我在VBA中整合了一些逻辑以形成数据 让我先给你讲一下这方面的情况。我要传输的数据是发票文件。每行都有库存项目代码、价格、发票编号、发票日期、客户名称等。这些需要传输到专有ERP系统的数据库中 数据库中有两个表我现在感兴趣。第一个保存发票的标题数据(客户数据、日期、发票号、发票总额等)。第二个表包含库存项目的信息(已售出的商品、数量和金额等) 每次插入第一个表之后,我必须获取
SCOPE\u IDENTITY()
函数。当我试图通过SQLServerManagementStudio直接在数据库上执行此操作时,它可以顺利工作
但是当我尝试在代码中使用它时,它返回一个空记录集
我使用的代码如下所示:
Public Function Execute(查询为字符串,可选为\u batch As Boolean=False)为ADODB.Recordset
如果连接状态=0,则
开放连接
如果结束
设置rs=conn.Execute(query)'这是要执行的实际查询
Dim标识为ADODB.Recordset'此标识应包含插入行的主键,但返回一个空记录集
Set identity=conn.Execute(“选择范围_identity();”)
如果TypeName(identity.Fields(0).Value)=“Null”,则
pInsertedId=-1
其他的
pInsertedId=identity.Fields(0).Value'我将它保存在一个对象变量中,以便以后方便地访问它
如果结束
将Execute=rs'设置为返回给调用者
'关闭连接的操作在此过程之外进行
端函数
当我在VBA上运行它时,第二个查询选择SCOPE_IDENTITY()代码>仅返回一个空记录集。当直接在数据库上运行时,相同的查询可以成功运行
事实上,我可以通过其他方式完成这件事。有一个UUID列,我应该将它插入到第一个表中的行中。我可以简单地用这个UUID查询表并获得PK,但我只是好奇为什么这不起作用
有什么想法吗 您的代码不插入任何数据,因此当前范围内不会生成标识值,如官方文档中所定义:
返回插入到同一范围内标识列中的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句位于同一存储过程、函数或批处理中,则它们位于同一范围内
您的代码实际上与在SSMS的一个查询窗口中插入数据和在另一个查询窗口中查询SCOPE_IDENTITY()相同。嗯,事情不是这样的。您必须在同一范围内查询它,即存储过程、触发器、函数或批处理。否则,请使用您生成的ID值并将其与数据一起插入。您的代码不会插入任何数据,因此在当前范围内不会生成标识值,如官方文档中所定义:
返回插入到同一范围内标识列中的最后一个标识值。作用域是一个模块:存储过程、触发器、函数或批处理。因此,如果两条语句位于同一存储过程、函数或批处理中,则它们位于同一范围内
您的代码实际上与在SSMS的一个查询窗口中插入数据和在另一个查询窗口中查询SCOPE_IDENTITY()相同。嗯,事情不是这样的。您必须在同一范围内查询它,即存储过程、触发器、函数或批处理。否则,请使用您生成的ID值,并将其与数据一起插入。您的scope\u identity
是(范围)。您需要。SQL Server是由Microsoft提供的关系数据库产品,而T-SQL(Transact-SQL)是SQL Server(任何Sybase)使用的SQL(查询)语言的“方言”。您的scope\u identity
是(即作用域)。您需要这样做。SQL Server是Microsoft提供的关系数据库产品,而T-SQL(Transact-SQL)是SQL Server(任何Sybase)所使用的SQL(查询)语言的“方言”。好了,现在可以理解了。我记得在某个地方读到,只要查询在同一个连接中,SCOPE_IDENTITY()就应该工作,但显然不行。非常感谢。好的,现在我明白了。我记得在某个地方读到,只要查询在同一个连接中,SCOPE_IDENTITY()就应该工作,但显然不行。谢谢。