[EDIT]Как получить последнее значение Identity и использовать его в инструкции INSERT в SQLServer/Azure?
В ответ на советы Митч пшеницы, в Вставки теперь работают с (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');
.. но почему я не могу заставить его работать с двумя другими?
спасибо.
В стороне: исходя из Oracle, представление о том, что таблица может быть создана как нечто, отличное от таблицы кучи, не указывая как таковое, является безумным. Это облачная вещь? Кто-нибудь знает цель этого?
[/ EDIT]
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'.
Кроме того, следующие выберите заявления возвращают нуль, после INSERT
в test1:
SELECT SCOPE_IDENTITY();
SELECT @@IDENTITY;
Принимая во внимание следующие возвращает правильное значение:
SELECT IDENT_CURRENT('test1');
Возможно, это глупый вопрос, но вы используете одно и то же соединение, чтобы выбрать SCOPE_IDENTITY(), не позволяя ему закрываться между ними, не так ли? –