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不能调用这些命令中的任何一个。