0

我正在尝试在 sql 中插入 2 个用户。因此,我将 Identity-increment 设置为 2。现在我正在生成类似的 ID 1、3、5。并添加第二个用户,我正在使用这个:

SET   IDENTITY_INSERT tblTesting ON;
 INSERT    INTO            tblTesting((@@Identity + 1), 'def');
SET  IDENTITY_INSERT tblTesting OFF;

但是这个给了我错误。我怎样才能做到这一点?

我正在使用这种方法,因为我同时注册了两个用户,第二个用户与第一个用户有关系。因此,每当我使用第一个用户 ID 时,我都可以使用 ID+1 检索第二个用户。我更喜欢有 2 个列,其中 2 个表相似,但第二个用户表引用了第一个表。在这种情况下我应该怎么做?

4

1 回答 1

2

而不是尝试将显式值插入IDENTITY列中,您应该使用SCOPE_IDENTITY函数来获取为当前范围和会话生成的最后一个 IDENTITY 值:

SET NOCOUNT ON;
CREATE TABLE dbo.Users(
    UserID INT IDENTITY(1,1) PRIMARY KEY,
    UserName NVARCHAR(200) NOT NULL
);

INSERT INTO dbo.Users (UserName)
VALUES ('John007');
SELECT SCOPE_IDENTITY() AS LastIdentityInserted#1;

INSERT INTO dbo.Users (UserName)
VALUES ('Mary008');
SELECT SCOPE_IDENTITY() AS LastIdentityInserted#2;

结果:

LastIdentityInserted#1
----------------------
1

LastIdentityInserted#2
----------------------
2

但是,如果您想要/需要仅插入一行,那么您应该使用 OUTPUT 子句:

DECLARE @inserted TABLE(UserID INT NOT NULL);
INSERT INTO dbo.Users (UserName)
OUTPUT inserted.UserID INTO @inserted(UserID)
SELECT ('George009')
UNION ALL
SELECT ('Jiji010');

-- Get the IDENTITY values for the last INSERT statement   
SELECT * FROM @inserted;

结果(@inserted):

UserID
-----------
3
4

回答:

您不能@@IDENTITY像示例中那样使用函数:如果您有一个带有IDENTITY列的表,那么您只能以这种方式使用此函数:

INSERT INTO table(NonIdentityColumn) VALUES ('some value');
SELECT @@IDENTITY AS LastId_PerSession_And_ForAllScopes

此外,您可以使用@@IDENTITYSELECT INTO ... 来创建一个包含IDENTITY列的堆表:

SELECT columns , @@IDENTITY AS ColumnName
INTO table
FROM ...

另外,我的建议是阅读这篇文,以更好地了解这三个函数之间的区别: @@IDENTITYSCOPE_IDENTITY()IDENT_CURRENT

于 2013-08-06T07:10:31.373 回答