0

SQL に 2 人のユーザーを挿入しようとしています。そこで、Identity-increment を 2 に設定しました。今、そのように ID 1,3,5 を生成しています。2番目のユーザーを追加するには、これを使用しています:

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

しかし、これは私にエラーを与えています。これどうやってするの?

2 人のユーザーを同時に登録しているため、この方法を使用しています。2 番目のユーザーは 1 番目のユーザーと関係があります。したがって、1 番目のユーザー ID を使用するたびに、ID+1 を使用して 2 番目のユーザーを取得できます。2 つのテーブルが類似している 2 つの列を持つことを好みましたが、2 番目のユーザー テーブルは 1 番目のテーブルを参照しています。この場合、どうすればよいですか?

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

ただし、1行だけ挿入したい/必要な場合は、次のように 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 ...

また、このブログ投稿を読んで、これら 3 つの関数の違いをよりよく理解することをお勧めします: @@IDENTITYSCOPE_IDENTITY()IDENT_CURRENT

于 2013-08-06T07:10:31.373 に答える