1

[編集]

Mitch Wheat のアドバイスに応えて、insert は(SCOPE_IDENTITY(), 'Semi-Fail'), (@@IDENTITY, 'Semi-Fail');で動作するようになりました。ただし、どちらもNULL選択時に値を生成します。

create clustered index test2_inx ON test2 (test1_id);

INSERTの s は両方とも NULL を生成します

INSERT INTO test1 VALUES ('Semi-failure');
INSERT INTO test2 VALUES (SCOPE_IDENTITY(), 'Semi-failure');
INSERT INTO test1 VALUES ('Semi-failure');
INSERT INTO test2 VALUES (@@IDENTITY, 'Semi-failure');
SELECT * FROM test2;

IDENT_CURRENTただし、の使用は機能します。

INSERT INTO test1 VALUES ('Success');
INSERT INTO test2 VALUES (IDENT_CURRENT('test1'), 'Success');

...しかし、他の 2 つでは動作しないのはなぜですか?

ありがとうございました。

余談ですが、Oracle から来て、ヒープ テーブルとして指定せずにテーブルをヒープ テーブル以外のものとして作成できるという考えは、まあ、正気ではありません。それはクラウドのことですか?その目的を知っている人はいますか?

[/編集]

DDL:

CREATE TABLE test1 (
 id int identity(1,1)
,value varchar(20)
,CONSTRAINT test1_id_pk PRIMARY KEY (id)
);
CREATE TABLE test2 (
 id int
,value varchar(20)
,CONSTRAINT test2_id_fk FOREIGN KEY (id) REFERENCES test1 (id)
)

test1 ステートメントに挿入します。

INSERT INTO test1 VALUES ('failure');

次のすべてが同じエラーで失敗します。

INSERT INTO test2 VALUES (SCOPE_IDENTITY(), 'fail');
INSERT INTO test2 VALUES (select SCOPE_IDENTITY(), 'fail');
INSERT INTO test2 VALUES ( (select SCOPE_IDENTITY()) , 'fail');
INSERT INTO test2 VALUES (@@IDENTITY, 'fail');
INSERT INTO test2 VALUES (select @@IDENTITY, 'fail');
INSERT INTO test2 VALUES ( (select @@IDENTITY), 'fail');
INSERT INTO test2 VALUES (IDENT_CURRENT('test1'), 'fail');
INSERT INTO test2 VALUES (select IDENT_CURRENT('test1'), 'fail');
INSERT INTO test2 VALUES ( (select IDENT_CURRENT('test1'), 'fail');

上記の各INSERTステートメントについて、次のいずれかのエラーが表示されます。

Tables without a clustered index are not supported in this version of SQL Server. Please create a clustered index and try again.
Incorrect syntax near the keyword 'select'.

さらに、次の select ステートメントは、INSERTtest1 への a の後、null を返します。

SELECT SCOPE_IDENTITY();
SELECT @@IDENTITY;

以下は正しい値を返します。

SELECT IDENT_CURRENT('test1');
4

1 に答える 1

1

テーブルにクラスター化インデックスを定義する必要があります(投稿したエラーメッセージに記載されています)。

Microsoft Windows Azure SQL データベースはヒープ テーブルをサポートしていないため、テーブルにはクラスター化インデックスが必要です。クラスター化制約なしでテーブルを作成する場合は、テーブルで挿入操作を行う前に、クラスター化インデックスを作成する必要があります。

参照

それを行うと、SELECT SCOPE_IDENTITY()動作するはずです。

于 2013-03-17T03:37:13.140 に答える