scope_identity返回null

时间:2012-11-05 17:14:21

标签: sql sql-server tsql

我正在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。哪里错了?

3 个答案:

答案 0 :(得分:3)

如果有标识字段,scope_identity将只返回一个值,检查您是否有标识字段。

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

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

答案 1 :(得分:3)

使用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

答案 2 :(得分:0)

我可以看到,您在insert语句中为列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 

我希望这适合你。