1

[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'); 
+0

Возможно, это глупый вопрос, но вы используете одно и то же соединение, чтобы выбрать SCOPE_IDENTITY(), не позволяя ему закрываться между ними, не так ли? –

ответ

1

Вы сусло определите кластеризованный индекс в ваших таблицах (как описано в сообщении об ошибке, которое вы опубликовали).

Because Microsoft Windows Azure SQL Database does not support heap tables, a table must have a clustered index. If a table is created without a clustered constraint, a clustered index must be created before an insert operation is allowed on the table.

Ref.

Сделайте это, а затем SELECT SCOPE_IDENTITY() должно работать.

+0

Спасибо @ Митч Пшеница. Я внес изменения, но я не могу получить значение из SCOPE_IDENTITY. Не могли бы вы сослаться на мои правки? –

+0

Я предлагаю вам задать отдельный вопрос, а не переманить его. –

+0

Мой вопрос заключается в том, как вставить последнее созданное значение из столбца Identity в Azure.Я благодарю вас за советы по созданию кластерного индекса, поскольку Azure отличается от обычного SQLServer, но мое использование 'SCOPE_IDENTITY' возвращает значение« NULL », и поэтому мой вопрос все еще стоит. –