6

我想简单地将一些信息从一个简单的客户端发送到一个日志文件,然后使用创建的身份进行进一步处理。

下面的用法SCOPE_IDENTITY()正确吗?

CREATE PROCEDURE [dbo].[LogSearch]
    @userName       VARCHAR(50),
    @dateTimeStart  DATETIME        
AS
BEGIN
SET NOCOUNT ON;


    INSERT INTO [WH].[dbo].[tb_Searches]
            (
            [UserName],
            [DateTimeStart]
            )
    SELECT  @userName, 
        @dateTimeStart;

    SELECT SCOPE_IDENTITY() AS ProfileKey;

END;

编辑

我已将代码编辑为以下内容:

ALTER PROCEDURE [dbo].[LogSearch]
    @userName   VARCHAR(50),
    @dateTimeStart  DATETIME
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [WH].[dbo].[tb_Searches]
            (
            [UserName],[DateTimeStart]
            )
    VALUES  (@userName, @dateTimeStart);

    RETURN SCOPE_IDENTITY();

END;
4

3 回答 3

30

似乎这是最好的方法 - 可以看到一些参考建议仅用RETURN作传达状态或错误的一种方式,因此OUTPUT参数是更好的做法:

ALTER PROCEDURE [dbo].[LogSearch]
    @userName      VARCHAR(50),
    @dateTimeStart DATETIME,
    @searchID      INT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [WH].[dbo].[tb_Searches]
                (
                UserName,
                DateTimeStart
                )
    VALUES  
                (
                @userName, 
                @dateTimeStart
                );

    SET @searchID = SCOPE_IDENTITY();

END;
于 2013-04-04T21:57:36.017 回答
3

您还可以SCOPE_IDENTITY在两个单独的语句中使用,例如:

假设该表当然有一个身份字段

Insert into [ABCTable]
([A], [B])
select 'WhateverA', 'WhateverB'

然后使用子句SCOPE_IDENTITY()中的函数,例如:Where

Update [ABCTable] Set [A] = 'UpdateA', [B] = 'UpdateB'
Where IdentityField = SCOPE_IDENTITY()

因此,scope_identity 是指向刚刚插入的记录的可靠链接。

于 2016-04-22T17:08:48.263 回答
2
RETURN SCOPE_IDENTITY() 

0正在用 Dapper返回一个。
我把它换成了

SELECT SCOPE_IDENTITY()

现在它正在返回实际值。

于 2019-08-13T17:39:54.420 回答