mel*_*bic 279 sql sql-server sql-server-2008
我试图在INSERT声明后得到一个键值.示例:我有一个包含属性name和id的表.id是生成的值.
INSERT INTO table (name) VALUES('bob');
Run Code Online (Sandbox Code Playgroud)
现在我想在同一步骤中恢复身份.这是怎么做到的?
我们正在使用Microsoft SQL Server 2008.
gbn*_*gbn 441
无需单独的SELECT ...
INSERT INTO table (name)
OUTPUT Inserted.ID
VALUES('bob');
Run Code Online (Sandbox Code Playgroud)
这适用于非IDENTITY列(例如GUID)
Cur*_*urt 175
使用SCOPE_IDENTITY()以获取新的ID值
INSERT INTO table (name) VALUES('bob');
SELECT SCOPE_IDENTITY()
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/ms190315.aspx
haj*_*ist 42
INSERT INTO files (title) VALUES ('whatever');
SELECT * FROM files WHERE id = SCOPE_IDENTITY();
Run Code Online (Sandbox Code Playgroud)
是最安全的赌注,因为在带触发器的表上存在OUTPUT子句冲突的已知问题.这使得这非常不可靠,即使您的表当前没有任何触发器 - 有人在线下添加一个会破坏您的应用程序.时间炸弹的行为.
有关更深入的解释,请参阅msdn文章
Ian*_*oyd 26
实体框架执行类似于gbn的答案:
DECLARE @generated_keys table([Id] uniqueidentifier)
INSERT INTO Customers(FirstName)
OUTPUT inserted.CustomerID INTO @generated_keys
VALUES('bob');
SELECT t.[CustomerID]
FROM @generated_keys AS g
JOIN dbo.Customers AS t
ON g.Id = t.CustomerID
WHERE @@ROWCOUNT > 0
Run Code Online (Sandbox Code Playgroud)
输出结果存储在临时表变量中,然后选择回客户端.必须要知道这个问题:
insert可以生成多行,因此变量可以包含多行,因此可以返回多行
ID
我不知道为什么EF会将短暂的表连接回真实表(在什么情况下两者不匹配).
但这就是EF所做的.
SQL Server 2008或更新版本.如果它是2005年,那么你运气不好.
Rez*_*abi 17
插入后退出的方式有很多种
向表中插入数据时,可以使用 OUTPUT 子句返回已插入表中的数据的副本。OUTPUT 子句采用两种基本形式:OUTPUT 和 OUTPUT INTO。如果要将数据返回到调用应用程序,请使用 OUTPUT 表单。如果要将数据返回到表或表变量,请使用 OUTPUT INTO 表单。
DECLARE @MyTableVar TABLE (id INT,NAME NVARCHAR(50));
INSERT INTO tableName
(
NAME,....
)OUTPUT INSERTED.id,INSERTED.Name INTO @MyTableVar
VALUES
(
'test',...
)
Run Code Online (Sandbox Code Playgroud)
IDENT_CURRENT:它返回为任何会话中的特定表或视图创建的最后一个标识。
SELECT IDENT_CURRENT('tableName') AS [IDENT_CURRENT]
Run Code Online (Sandbox Code Playgroud)
SCOPE_IDENTITY:它返回来自同一会话和同一范围的最后一个身份。范围是存储过程/触发器等。
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];
Run Code Online (Sandbox Code Playgroud)
@@IDENTITY:它返回同一会话的最后一个身份。
SELECT @@IDENTITY AS [@@IDENTITY];
Run Code Online (Sandbox Code Playgroud)
@@ IDENTITY是一个返回最后插入的标识值的系统函数.
小智 6
有多种方法可以在插入命令后获取最后插入的 ID。
@@IDENTITY :它返回在当前会话中的连接上生成的最后一个标识值,而不管表和产生该值的语句的范围SCOPE_IDENTITY(): 返回当前连接中当前作用域中insert语句生成的最后一个标识值,不考虑表。IDENT_CURRENT(‘TABLENAME’):无论任何连接、会话或范围如何,它都会返回在指定表上生成的最后一个标识值。IDENT_CURRENT 不受范围和会话的限制;它仅限于指定的表。现在似乎更难决定哪一个将完全符合我的要求。
我最喜欢 SCOPE_IDENTITY()。
如果您在插入语句中使用 select SCOPE_IDENTITY() 和 TableName,您将获得符合您期望的确切结果。
来源:CodoBee
最好和最确定的解决方案是使用SCOPE_IDENTITY().
只是您必须在每次插入后获取范围标识并将其保存在变量中,因为您可以在同一范围内调用两次插入。
ident_current并且@@identity可能它们有效,但它们不是安全范围。您可能会在大型应用程序中遇到问题
declare @duplicataId int
select @duplicataId = (SELECT SCOPE_IDENTITY())
Run Code Online (Sandbox Code Playgroud)
更多细节在这里Microsoft docs
| 归档时间: |
|
| 查看次数: |
480494 次 |
| 最近记录: |