Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server T-SQL-选择范围\u标识在vba代码中不起作用_Sql Server_Vba_Tsql - Fatal编程技术网

Sql server T-SQL-选择范围\u标识在vba代码中不起作用

Sql server T-SQL-选择范围\u标识在vba代码中不起作用,sql-server,vba,tsql,Sql Server,Vba,Tsql,我正在从事一个项目,该项目包括将数千行Excel数据传输到SQL Server(如果我是对的话,也称为T-SQL)数据库。我在VBA中整合了一些逻辑以形成数据 让我先给你讲一下这方面的情况。我要传输的数据是发票文件。每行都有库存项目代码、价格、发票编号、发票日期、客户名称等。这些需要传输到专有ERP系统的数据库中 数据库中有两个表我现在感兴趣。第一个保存发票的标题数据(客户数据、日期、发票号、发票总额等)。第二个表包含库存项目的信息(已售出的商品、数量和金额等) 每次插入第一个表之后,我必须获取

我正在从事一个项目,该项目包括将数千行Excel数据传输到SQL Server(如果我是对的话,也称为T-SQL)数据库。我在VBA中整合了一些逻辑以形成数据

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

数据库中有两个表我现在感兴趣。第一个保存发票的标题数据(客户数据、日期、发票号、发票总额等)。第二个表包含库存项目的信息(已售出的商品、数量和金额等)

每次插入第一个表之后,我必须获取插入行的主键,以便将行插入第二个表,这需要每行上第一个表的主键

现在,我的方法是使用T-SQL的
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()就应该工作,但显然不行。谢谢。