我正在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。哪里错了?
答案 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
我希望这适合你。