我需要严格按照当前会话获取特定表中的最后插入行。我无法使用@@IDENTITY
,SCOPE_IDENTITY()
因为它们将返回ANY表的最后插入的标识。问题IDENT_CURRENT
在于它将返回记录的最后插入标识,该记录是针对特定表但针对任何会话的。这对我来说是个问题,因为INSERT
多个会话调用了,并且我特别需要特定会话的最后插入记录的标识。
任何指针如何做到这一点?
ps。该INSERT
语句不在SPROC内部,因此SPROC解决方案不可行。
谢谢
我知道这不是您似乎想听到的答案,但答案是使用SCOPE_IDENTITY()
。您正在考虑的问题( 任何
表的位置)是我们为什么使用SCOPE_IDENTITY()
而不是的原因@@IDENTITY
。考虑这样一种情况:您有一个带有IDENTITY
列的表,并且在该表上有一个插入触发器,该触发器本身插入到带有IDENTITY
列的表中。
CREATE TABLE dbo.Log(LogID INT IDENTITY(100,1), FooID INT);
CREATE TABLE dbo.Foo(FooID INT IDENTITY(1,1), name VARCHAR(32));
GO
CREATE TRIGGER dbo.Foo_Insert
ON dbo.Foo
FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
INSERT dbo.Log(FooID) SELECT FooID FROM inserted;
END
GO
现在,您的情况是您想要一种可靠的方式来在插入后检索ID。SCOPE_IDENTITY()
给您的是,因为它仅限于 您的范围
,而@@IDENTITY
不仅限于您的范围(这意味着它将捕获最后一个IDENTITY
发出的事件,发生在触发器的范围内,而不是您的范围内:
INSERT dbo.Foo(name) SELECT 'Bob';
SELECT
@@IDENTITY,
SCOPE_IDENTITY();
结果:
---- ----
100 1
请注意,在插入多行的情况下,都不应该使用SCOPE_IDENTITY()
或@@IDENTITY
。做到这一点的方法是使用该OUTPUT
子句。首先让我们放下触发器:
DROP TRIGGER dbo.Foo_Insert;
现在让我们测试一个多行插入:
INSERT dbo.Foo(name)
OUTPUT inserted.FooID, inserted.name
SELECT 'Frank' UNION ALL SELECT 'Jim';
结果:
FooID name
----- -----
2 Frank
3 Jim
如果您有条件插入,则没有区别。保留我们拥有的表,让我们尝试两次此代码:
DECLARE @table SYSNAME;
SET @table = N'Log';
IF @table = N'Log'
BEGIN
INSERT dbo.Log(FooID) SELECT 10;
END
IF @table = N'Foo'
BEGIN
INSERT dbo.Foo(name) SELECT 'Tom';
END
SELECT SCOPE_IDENTITY();
结果:
----
101
让我们再试一次N'Foo'
:
DECLARE @table SYSNAME;
SET @table = N'Foo';
IF @table = N'Log'
BEGIN
INSERT dbo.Log(FooID) SELECT 10;
END
IF @table = N'Foo'
BEGIN
INSERT dbo.Foo(name) SELECT 'Tom';
END
SELECT SCOPE_IDENTITY();
结果:
----
4
如果比这更复杂(例如,您可以插入多个表中),则可以执行以下操作:
IF <some conditional>
BEGIN
INSERT dbo.sometable ...
SET @somevar = SCOPE_IDENTITY();
END
IF <some other conditional>
BEGIN
INSERT dbo.some_other_table ...
SET @some_other_var = SCOPE_IDENTITY();
END
我不确定您为什么认为这行不通,也不确定为什么我必须花这么长时间才能说服您这样做。同样,如果您显示了一个不起作用的示例(或者您认为可能干扰的“任何表”),我们也许可以发表评论。就目前而言,听起来您的意见SCOPE_IDENTITY()
基于您所听说的内容@@IDENTITY
。这些假设很容易证明或反驳自己。
顺便说一句,IDENT_CURRENT
在此对话中甚至不应提及。完全不能将并发活动用于并发活动,并且您应该假装就我而言从未听说过它。您也应该考虑相同的问题@@IDENTITY
-我无法想到它的有效用法,除非您确实确实想从触发器外部捕获触发器IDENTITY
内部生成的内容。
启动多个驱动程序时出错。在循环中获取命令。我曾观察过有类似问题的人,例如org。openqa。硒。NoSuchSessionException:在使用ChromeDriver Chrome和Java的Selenium自动化测试中没有这样的会话错误,但问题是jdk版本、Chrome版本等等。我可以为每个webdriver实例启动一个get命令,所以我不认为这是我的jdk、chromedriver或s
问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何
早上好, 当我从Hibernate3升级到4时,出现了“臭名昭著的”当前会话错误。我搜索了一下,似乎一切都安排妥当了。我需要一些洞察力:) 这是我的配置:Spring3.2Hibernate4.1.9 数据源上下文: 业务背景: 我的服务层: 最后,DAO实现: 这里是stackTrace: 谢谢你的帮助! 编辑: 好的,我清理了配置文件,现在: 对于DAO: 对于业务层: 并从DAO中删除@Tr
问题内容: 我在Spring3和Hibernte4中遇到上述异常 以下是我的bean xml文件 我的BaseDAO类看起来像这样 以下代码在标题中引发异常 有谁知道如何解决这个问题? 问题答案: 仅在交易范围内有意义。 您需要声明一个适当的事务管理器,划分事务边界并在其中进行数据访问。例如,如下: 。 也可以看看: 10.交易管理 13.3hibernate
问题内容: 这是大多数DAO中使用的典型设置: 我看到只有呼叫,否或。 因此,当我从不在会话中返回实体时,无法加载惰性集合。类似地,保存似乎总是同花顺! Spring 的注解本身就具有开启和关闭会话以及交易的魔力吗? 问题答案: 在Spring中,由划定的业务交易与hibernate之间存在一一对应的关系。 也就是说,当通过调用方法开始业务交易时,将创建hibernate会话(Transactio
我试图在一个演示的独立应用程序中使用Spring,使用DAO层和服务层来使用委托的Hibernate事务。 我已经正确地设置了配置,并且我已经对DAO方法上使用@Transactional注释进行了单元测试,测试结果表明它可以正常工作,但是当我将这个注释移动到服务层时,我得到了一个: 我提供了代码中最相关的部分,希望您能给我一个提示,让我了解这里发生了什么。 在GenericDaoHibernat