Sql server SQL Server了解范围_标识()
我在存储过程中有一段代码:Sql server SQL Server了解范围_标识(),sql-server,tsql,Sql Server,Tsql,我在存储过程中有一段代码: BEGIN SET @UserId = NULL; IF (@Username IS NOT NULL) BEGIN EXECUTE SP_ADD_USER @Username, @UserId OUTPUT; END EXECUTE SP_ADD_ALERT @Name, @AlertType, @AlertId OUTPUT; INSERT INTO AlertLogs (Datastamp, Ale
BEGIN
SET @UserId = NULL;
IF (@Username IS NOT NULL)
BEGIN
EXECUTE SP_ADD_USER @Username, @UserId OUTPUT;
END
EXECUTE SP_ADD_ALERT @Name, @AlertType, @AlertId OUTPUT;
INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage)
VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage);
SET @AlertLogId = SCOPE_IDENTITY();
END
@AlertLogId
是一个输出参数,我希望将其分配给AlertLogs
表中最后一次插入的结果。我必须包括在内吗
INSERT INTO AlertLogs (Datastamp, AlertID, UserID, NotificationMessage)
VALUES (@Datastamp, @AlertId, @UserId, @EmailMessage);
在新块(新的开始/结束作用域)中,以使scope\u IDENTITY()
正常工作?
(例如,不报告在
SP_ADD_ALERT
中插入的记录的最后一个ID)在您的查询中,SCOPE_IDENTITY()
将把上次输入的标识值返回到此范围的数据库
在本例中,它将是AlertLogs
表的标识(如果该表具有标识)
作用域是一个模块:存储过程、触发器、函数或批处理。
因此,如果两个语句在同一范围内,则它们在同一范围内
相同的存储过程、函数或批处理
您也可以在insert语句中使用。这意味着您不需要担心范围,并且可以从插入的表中获得其他(非标识)信息
考虑一下这个简单的表:
CREATE TABLE [dbo].[SampleTable](
[ID] [int] IDENTITY(1,1) NOT NULL,
[InsertDate] [datetime] NOT NULL,
[Name] [nvarchar](100) NULL
) ON [PRIMARY]
添加此默认值后:
ALTER TABLE [dbo].[SampleTable]
ADD CONSTRAINT [DF_SampleTable_Inserted]
DEFAULT (getdate()) FOR [InsertDate]
您可以从插入操作中获取默认值和标识值
DECLARE @InsertedDetails TABLE (ID int, InsertDate DateTime);
INSERT INTO SampleTable ([Name])
OUTPUT inserted.ID, inserted.InsertDate
INTO @InsertedDetails
VALUES ('Fred');
DECLARE @ID int;
DECLARE @InsertDate datetime;
SELECT @ID = ID, @InsertDate = InsertDate FROM @InsertedDetails;
PRINT @ID;
PRINT @InsertDate;
在这里,我刚刚从表变量中取出值并打印出来。这也是我所期望的。EXECUTE SP_ADD_ALERT在另一个作用域中执行,因此在任何情况下都不会考虑该作用域,即使该作用域也插入了标识值。它在msdn站点上声明这两条语句必须位于同一存储过程中,函数等。虽然我不明白为什么您会在函数中使用
SCOPE\u IDENTITY
,因为您不能INSERT
或EXEC
函数是否可以执行任何会导致触发器插入某些内容的操作,如果是,插入是否会影响SCOPE\u IDENTITY()的值在函数中?@Matt Sach-triggers是一个不同的作用域(如上面的引用所示),因此不,触发器不能影响scope\u IDENTITY()
调用(也位于触发器主体中的除外)。@MattSach-Table触发器可以通过插入、更新或删除调用。UDF不能调用这些命令中的任何一个。