[編集]
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 ステートメントは、INSERT
test1 への a の後、null を返します。
SELECT SCOPE_IDENTITY();
SELECT @@IDENTITY;
以下は正しい値を返します。
SELECT IDENT_CURRENT('test1');