我执行UPDATE与OUTPUT查询:
UPDATE BatchReports
SET IsProcessed = 1
OUTPUT inserted.BatchFileXml, inserted.ResponseFileXml, deleted.ProcessedDate
WHERE BatchReports.BatchReportGUID = @someGuid
Run Code Online (Sandbox Code Playgroud)
这句话很好,很好; 直到在表上定义了一个触发器.然后我的UPDATE陈述将得到错误334:
如果语句包含没有INTO子句的OUTPUT子句,则DML语句的目标表'BatchReports'不能具有任何已启用的触发器
现在,SQL Server团队在博客文章中解释了这个问题:
错误消息是不言自明的
他们还提供解决方案:
该应用程序已更改为使用INTO子句
除了我无法做出整篇博文的正面或反面.
所以让我问一下我的问题:我应该改变什么UPDATE才能使它有效?
我有一个存储过程,首先将一些数据插入临时表,然后将行插入另一个表.我在第二次插入后调用Scope_Identity()来获取新插入的记录Identity.
如果第二个插入由于连接而没有做任何事情,我想检查Scope_Identity并引发异常.但Scope_Identity返回在第二次插入之前从临时表插入创建的最后一个标识.
有没有办法在调用第二个插入之前重置SCOPE_IDENTITY,或者更好的方法来确定第二个插入是否实际上没有插入任何内容?
在SQL Server 2005中,我使用存储过程将一行插入表中,我想在插入该行后立即获取新的主键值.我使用以下方法来获取插入行后的主键值
Create Proc Sp_Test
@testEmail varchar(20)=null,-- Should be Unique
@testName varchar(20)=null -- Should be Unique
as
begin
insert into tableTest (testUserEmail,testUserName)values (@testValue,@testName)
select MAX(ID) from tableTest --ID is Primary Key
Run Code Online (Sandbox Code Playgroud)
- 要么
select ID from tableTest where testUserEmail =@testValue and testUserName = @testName
Run Code Online (Sandbox Code Playgroud)
- 要么
select SCOPE_IDENTITY() as ID
end
Run Code Online (Sandbox Code Playgroud)
请建议我哪种方法更好地执行所描述的任务.
我是存储过程的新手,只知道SQL的基础知识.在一些SO问题的帮助下,我能够发现该SCOPE_IDENTITY()函数可用于获取最近添加的行的标识值.现在我尝试使用存储过程在表中插入一行,并且我希望必须将此新插入行的标识分配给存储过程的变量.以下是代码:
DECLARE @retID int = -1
SET @retID = (INSERT INTO [InfoValues]([InfoID],[Value],[UserID],[DateAdded],[DateUpdated]) VALUES(@item2,@item,@UserID,GETDATE(), GETDATE()); SELECT SCOPE_IDENTITY())
Run Code Online (Sandbox Code Playgroud)
但是此代码在INSERT子句中显示语法错误.那么正确的方法是什么?