2014-09-02 3 views
2

Я хочу использовать серию вставки непосредственно в следующей вставке.Ошибка синтаксиса в DECLARE

на основе Help with T-SQL script: Insert record, then use identity of that insert on another statement? я выполнить следующий SQL-запрос:

DECLARE @Id1 BIGINT 
DECLARE @Id2 BIGINT 
INSERT INTO doses (CPS, ground, total) VALUES (10, 10, 10) 
SET @Id1 = SELECT SCOPE_IDENTITY() 
INSERT INTO places (x, y, z, speed) VALUES (10, 10, 10, 10) 
SET @Id2 = SELECT SCOPE_IDENTITY() 
INSERT INTO measurements (time, place, note, dose, id_dataset) VALUES ('Test', @Id1, 'test', @Id2, 17) 

Это дает мне ошибку синтаксиса, и я не могу найти ничего плохого с моей DECLARE.

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE @Id1 BIGINT 
DECLARE @Id2 BIGINT INSERT INTO doses (CPS, ground, total)' at line 1 

Похоже, что DECLARE в MySQL может использоваться только в BEGIN..END. http://dev.mysql.com/doc/refman/5.0/en/declare.html

Также SCOPE_IDENTITY заменяет LAST_INSERT_ID().

Это мой новый запрос:

BEGIN 

DECLARE @Id1 BIGINT; 
DECLARE @Id2 BIGINT; 

INSERT INTO doses (CPS, ground, total) VALUES (10, 10, 10); 
SET @Id1 = (SELECT LAST_INSERT_ID()); 

INSERT INTO places (x, y, z, speed) VALUES (10, 10, 10, 10); 
SET @Id2 = (SELECT LAST_INSERT_ID()); 

INSERT INTO measurements (time, place, note, dose, id_dataset); 
VALUES ('Test', @Id1, 'test', @Id2, 17); 

END 

Но я все еще получаю ту же ошибку.

+0

Нет необходимости выбирать из области действия, ее выход, просто удалить SELECT - 'SET @ Id1 = SCOPE_IDENTITY()' –

+0

Можете ли вы разместить полное сообщение об ошибке и версию SQL Server, которую используете? – DrCopyPaste

+0

Я добавил его к вопросу. – Milan

ответ

1

кажется you cannot declare and use variables outside triggers/procedures/functions or events. Таким образом, вы также не можете обойти это, просто напишите BEGIN...END вокруг него.

Поскольку вам нужно два разных значения идентификатора в одном выводе, вы можете либо обернуть его в хранимую процедуру (которая должна обойти проблему неспособности объявить переменные), либо просто использовать значение MAX -значения идентификатора в обоих столбцы в вашем окончательном вставке-заявлении. (это, конечно, предполагается, что у auto_increment включен или, по крайней мере, восходящие идентификаторы в обеих таблицах)

Таким образом, в сущности, вы должны быть в состоянии сделать его работу, если заменить весь свой код:

INSERT INTO doses (CPS, ground, total) VALUES (10, 10, 10); 

INSERT INTO places (x, y, z, speed) VALUES (10, 10, 10, 10); 

INSERT INTO measurements (time, place, note, dose, id_dataset) 
VALUES ('Test', (SELECT MAX(ID) FROM doses), 'test', (SELECT MAX(ID) FROM places), 17); 

Вы также должны обернуть это в транзакции, чтобы быть уверенным, что никакие другие идентификаторы не были вставлены в это время.

+0

Не могли бы вы удалить; после измерений INSERT INTO (время, место, примечание, доза, id_dataset); – Milan

+0

ну да, конечно! спасибо. – DrCopyPaste

-1

Похоже проблема с установкой @ Id1 и @ Id2

DECLARE @Id1 BIGINT 
    DECLARE @Id2 BIGINT 

    INSERT INTO doses (CPS, ground, total) VALUES (10, 10, 10) 
    SET @Id1 = SCOPE_IDENTITY() 

    INSERT INTO places (x, y, z, speed) VALUES (10, 10, 10, 10) 
    SET @Id2 =SCOPE_IDENTITY() 

    INSERT INTO measurements (time, place, note, dose, id_dataset) 
    VALUES ('Test', @Id1, 'test', @Id2, 17) 
+0

, но разве это не значит, что название вопроса неверно?Я вижу, что вы исправили проблему, которая должна была быть исправлена, но для этой конкретной ошибки ошибка должна была быть «Некорректный синтаксис рядом с ключевым словом« SELECT ».« Не синтаксическая ошибка в DECLARE », не так ли? – DrCopyPaste

+0

@DrCopyPaste: я не вижу никакой проблемы в объявлении переменной, я указываю, что место может пойти не так! –

+0

Это не решит проблему. Я также дважды проверял имена столбцов, но они кажутся правильными. Кроме того, тогда SQL не даст синтаксической ошибки в строке 1. Такое же решение было указано в комментариях к ответу связанного потока. И кажется, что и SELECT SCOPE_IDENTITY() и SCOPE_IDENTITY() верны. – Milan

0

его просто ошибка синтаксиса.

ВЫБРАТЬ @ ID1 = SCOPEIDENTITY() будет делать вам, я думаю, что

Смежные вопросы