首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >VB.Net获取在事务中使用的scope_identity()

VB.Net获取在事务中使用的scope_identity()
EN

Stack Overflow用户
提问于 2014-08-05 15:22:56
回答 1查看 4.3K关注 0票数 1

我使用一个VB.Net事务来执行两个查询。有两个表&下面是一个示例结构。

代码语言:javascript
运行
复制
USER
----
1. USER_ID - int (PK) AUTO_INCREMENT
2. USER_NAME - varchar(20)

ADDRESS
-----
1. USER_ID
2. USER_ADDRESS

由于这个基本结构所代表的用户可以拥有许多照片。每当我向用户表中插入新记录时,应该使用自动创建的USER_ID保存用户的照片。

我知道我需要为此目的使用SCOPE_IDENTITY(),但是对于SCOPE_IDENTITY()值,我总是获得NULL,这不是因为触发器或其他任何东西。问题在于VB.Net如何创建INSERT语句。

下面是查询在SQLServer探查器中的样子

插入到用户表

代码语言:javascript
运行
复制
exec sp_executesql N'INSERT INTO USER(USER_NAME) VALUES (@USER_NAME)',N'@USER_NAME nvarchar(4)',@USER_NAME =N'ABCD'

插入到地址表

代码语言:javascript
运行
复制
exec sp_executesql N'INSERT INTO ADDRESS(USER_ID,USER_ADDRESS) VALUES ((SELECT SCOPE_IDENTITY()),@USER_ADDRESS)',N'@ USER_ADDRESS nvarchar(10)',@USER_ADDRESS=N'ABCDEFGHIJ'

我已经将SELECT SCOPE_IDENTITY()直接附加到第二个查询中&我认为SCOPE_IDENTITY()命令是一个字符串,如何防止这种情况发生。

EN

Stack Overflow用户

回答已采纳

发布于 2014-08-05 15:38:48

顾名思义,scope_identity()是一个作用域的本地。sp_executesql运行在它自己的范围内部。稍后对sp_executesql的调用没有对早期作用域的记忆。

最合理的解决方案是在同一范围内运行这两个查询。我不知道为什么要使用sp_executesql;也许您可以省略这一点。大多数客户运行的内容如下:

代码语言:javascript
运行
复制
INSERT INTO USER(USER_NAME) VALUES (@USER_NAME);
SELECT SCOPE_IDENTITY() AS ID;

客户端程序可以从结果行集中获取ID。然后,它可以将ID作为参数传递给INSERT地址查询。不需要sp_executesql

如果必须使用多个sp_executesql,请考虑使用output参数来传递标识:

代码语言:javascript
运行
复制
declare @ID bigint

exec sp_executesql 
    N'INSERT INTO USER(USER_NAME) VALUES (@USER_NAME);
      SELECT @ID = SCOPE_IDENTITY();',
    N'@USER_NAME nvarchar(4), @ID bigint output',
    @USER_NAME = N'ABCD',
    @ID = @ID output;

现在可以将@ID作为变量传递给第二个sp_executesql

票数 4
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25142533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档