我使用一个VB.Net事务来执行两个查询。有两个表&下面是一个示例结构。
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探查器中的样子
插入到用户表
exec sp_executesql N'INSERT INTO USER(USER_NAME) VALUES (@USER_NAME)',N'@USER_NAME nvarchar(4)',@USER_NAME =N'ABCD'插入到地址表
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()命令是一个字符串,如何防止这种情况发生。
发布于 2014-08-05 15:38:48
顾名思义,scope_identity()是一个作用域的本地。sp_executesql运行在它自己的范围内部。稍后对sp_executesql的调用没有对早期作用域的记忆。
最合理的解决方案是在同一范围内运行这两个查询。我不知道为什么要使用sp_executesql;也许您可以省略这一点。大多数客户运行的内容如下:
INSERT INTO USER(USER_NAME) VALUES (@USER_NAME);
SELECT SCOPE_IDENTITY() AS ID;客户端程序可以从结果行集中获取ID。然后,它可以将ID作为参数传递给INSERT地址查询。不需要sp_executesql。
如果必须使用多个sp_executesql,请考虑使用output参数来传递标识:
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。
https://stackoverflow.com/questions/25142533
复制相似问题