2

我正在 SQL 服务器中编写一个 SP

ALTER PROCEDURE [dbo].[spAddUserBadge]
AS
BEGIN
    INSERT INTO dbo.SE_UserBadge
    (    
        [UID],
        BadgeID,
        BadgeAssignmentOrRenewalDate,
        BadgeExpiryDate ,
        AmountPaid, 
        Remarks ,
        AssignedBy          
    )
    VALUES
    (
        17,1, 12-12-2012, 12-12-2013, 0.00, '', ''
    )

    SELECT SCOPE_IDENTITY() AS id    
END
GO

SCOPE_IDENTITY 为 NULL。我错在哪里?

4

3 回答 3

4

使用OUTPUT运算符将插入的值输出到表变量中,然后检查这些值。

例子

ALTER PROCEDURE [dbo].[spAddUserBadge]
AS
BEGIN
    DECLARE @TBL AS TABLE(ID1 INT, ID2 INT)

    INSERT INTO dbo.SE_UserBadge
    (    
        [UID],
        BadgeID,
        BadgeAssignmentOrRenewalDate,
        BadgeExpiryDate ,
        AmountPaid, 
        Remarks ,
        AssignedBy          
    )
    OUTPUT inserted.ID1, inserted.ID2 INTO @TBL
    VALUES
    (
        17,1, 12-12-2012, 12-12-2013, 0.00, '', ''
    )

    SELECT * FROM @TBL  
END
GO
于 2012-11-05T17:28:03.630 回答
3

scope_identity 只会在有身份字段的情况下返回一个值,请检查您是否有身份字段。

不幸的是,您不能使用 sql 将现有列更改为标识字段。为此,您必须使用 ALTER TABLE dbo.SE_UserBadge ADD 列名称 INT IDENTITY(1,1) 之类的东西创建一个新列。然后,您必须使用带有更新语句的 IDENTITY_INSERT dbo.SE_UserBadge ON 传输任何现有值。然后你可以删除旧列。

或者,如果表不是太大,您可以在 SSMS 中使用设计器视图。

于 2012-11-05T17:19:45.743 回答
0

对于我所看到的,您在插入语句中为您的列 ID 提供了一个值,如果您想通过选择 scope_identity 来获取 ID,您需要将您的 ID 设置为身份主键。

这里是您创建表时的示例。

CREATE TABLE Person
(
    ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
    Name VARCHAR(20),
    LastName VARCHAR(20),
)

然后在您的存储过程中,您不需要提供 ID,这将自动生成

INSERT INTO Person (Name,LastName) VALUES ('YouName','YourLastName')

SELECT SCOPE_IDENTITY() AS ID 

我希望这对你有用。

于 2012-11-05T17:38:17.367 回答