Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
Здравствуйте!
Мне нужно решить такую задачу :
есть процедура вставки данных в несколько таблиц сразу. Вот часть её :
INSERT INTO Brands(brandOfCar) SELECT @brand WHERE NOT EXISTS(SELECT IdBrand FROM Brands WHERE Brands.brandOfCar = @brand);
SET @idBrand = @@IDENTITY
INSERT INTO Models(nameModel, brandId) SELECT @model, @idBrand WHERE NOT EXISTS(SELECT IdModel FROM Models WHERE Models.nameModel = @model);
SET @idModel = @@IDENTITY
INSERT INTO Cars(brandId, color, volumeOfEngine, description, modelId) VALUES (2, @color, @volumeOfEngine, @description, 3);
SET @idCar = @@IDENTITY
Процедура работает нормально, когда приходят все новые значения, но когда исполняется условие SELECT IdBrand FROM Brands WHERE Brands.brandOfCar = @brand, например, то происходит ошибка при вставке. Подозреваю, что ошибка в том, что @idBrand не присваивается никакое значение. Как здесь будет правильно сделать или хотя бы подскажите, как можно протестировать эту часть кода.
18 окт 11, 22:49    [11463003]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
например, то происходит ошибка при вставке. Подозреваю, что ошибка в том, что @idBrand не присваивается никакое значение.

А прочитать сообщение об ошибке вы пытались ?
18 окт 11, 23:23    [11463179]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
Glory
erman
например, то происходит ошибка при вставке. Подозреваю, что ошибка в том, что @idBrand не присваивается никакое значение.

А прочитать сообщение об ошибке вы пытались ?

Сообщение таково :
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Cars__brandId__023D5A04". The conflict occurred in database "CatalogueCars", table "dbo.Brands", column 'IdBrand'.
The statement has been terminated.
18 окт 11, 23:41    [11463238]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
erman,

Вставляете в таблицу значение 2
INSERT INTO Cars(brandId, color, volumeOfEngine, description, modelId) VALUES (2, @color, @volumeOfEngine, @description, 3);

А между таблицами Cars (поле brandId) и Brands (поле IdBrand) есть FOREIGN KEY.

SELECT IdBrand FROM Brands WHERE IdBrand =2
Такой запрос вернет запись?
19 окт 11, 00:02    [11463296]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
Это сообщение как раз говорит о том, что
erman
Сообщение таково :
The INSERT statement conflicted with the FOREIGN KEY constraint "FK__Cars__brandId__023D5A04". The conflict occurred in database "CatalogueCars", table "dbo.Brands", column 'IdBrand'.
The statement has been terminated.


INSERT INTO Cars(brandId, color, volumeOfEngine, description, modelId) VALUES (2, @color, @volumeOfEngine, @description, 3);
у вас тут явное значение задано для brandId
А каком "@idBrand не присваивается никакое значения" вы говорите ?
19 окт 11, 00:10    [11463330]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
INSERT INTO Cars(brandId, color, volumeOfEngine, description, modelId) VALUES (@idBrand, @color, @volumeOfEngine, @description, @idModel);
Так должно быть, а с готовыми цифрами работает - это уже я экспериментировал.
Связи между таблицами есть, всё работает только тогда, когда вставляются все новые значения - brand, model, но когда они уже есть в таблицах - возникают такие ошибки.
Как можно протестировать, чему равны значения @idBrand, @idModel во время выполнения скрипта?
19 окт 11, 00:24    [11463355]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
Связи между таблицами есть, всё работает только тогда, когда вставляются все новые значения - brand, model, но когда они уже есть в таблицах - возникают такие ошибки.

Что то вы опять придумываете
При FK ограничении в дочернюю таблицу как раз можно добавить только те значения, которые есть в родительской
А ваше сообщение говорит как раз о противоположном - о добавлении в дочернюю таблицу то, чего нет в родительской
19 окт 11, 00:30    [11463373]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
INSERT INTO Brands(brandOfCar) SELECT @brand [b]WHERE NOT EXISTS(SELECT IdBrand FROM Brands WHERE Brands.brandOfCar = @brand)[/b];
SET @idBrand = @@IDENTITY
Выделенная конструкция проверяет есть ли в таблице приходящее значение. Если нет - вставляется новое, если есть - нужно взять IdBrand для того, чтобы использовать его в дальнейшем. Проблема в том, что при вставке нового IdBrand всё идёт нормально, но если приходит значение с имеющимся IdBrand - происходит ошибка, описанная ранее. Для того я и хочу узнать какой IdBrand возвращается в том случае, когда не вставляется новая запись. Как реализовать это?
19 окт 11, 19:13    [11468875]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
erman,

добавьте SELECT @idBrand
19 окт 11, 19:18    [11468906]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
Проблема в том, что при вставке нового IdBrand всё идёт нормально, но если приходит значение с имеющимся IdBrand - происходит ошибка, описанная ранее. Для того я и хочу узнать какой IdBrand возвращается в том случае, когда не вставляется новая запись.

У вас ничего никуда не возвращается
Вы незавимо от результата предыдущей команды пихаете в переменную @idBrand значение @@IDENTITY
19 окт 11, 19:32    [11468978]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
@idBrand = @@IDENTITY
Это выражение записывает в @idBrand только-что вставленный idBrand - я правильно понимаю? Объясните, пожалуйста, как сделать правильно.
19 окт 11, 20:24    [11469127]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
то выражение записывает в @idBrand только-что вставленный idBrand - я правильно понимаю

И какой же объект вставляется, "если приходит значение с имеющимся IdBrand" ?
19 окт 11, 20:26    [11469132]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
добавьте SELECT @idBrand[/quot]
где именно добавить?
19 окт 11, 20:40    [11469156]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
Я понимаю это так - если вставляется новое значение, то в @idBrand записывается последний idBrand(напр. 15), если же значение уже есть в таблице - в @idBrand записывается значение idBrand, найденного по переменной @brand(напр. 2). Так это или нет. Если нет, то как? Объясните, пожалуйста, просто и доступно.
19 окт 11, 20:48    [11469179]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
если же значение уже есть в таблице - в @idBrand записывается значение idBrand, найденного по переменной @brand(напр. 2).

Это вам сказал кто или вы сами решили ?
19 окт 11, 20:53    [11469196]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
Glory
erman
если же значение уже есть в таблице - в @idBrand записывается значение idBrand, найденного по переменной @brand(напр. 2).

Это вам сказал кто или вы сами решили ?

Так это или нет. Если нет, то как? Объясните, пожалуйста, просто и доступно.
19 окт 11, 21:02    [11469228]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
erman,

переменной присваивается то, что вы ей присваиваете.
19 окт 11, 21:02    [11469233]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
Так это или нет. Если нет, то как? Объясните, пожалуйста, просто и доступно

А открыть хелп по @@IDENTITY и почитать что опять мешает ?
19 окт 11, 21:03    [11469239]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
Слушайте - не хотите помогать, то и не надо было начинать всё это, зачем вы забираете зря моё время...
19 окт 11, 21:06    [11469247]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
erman,

вот и не начинайте. Лень документацию читать - идите сюда.
19 окт 11, 21:19    [11469302]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
iljy,

документацию то я почитал, только это не решило моей проблемы. А ответы типа
добавьте SELECT @idBrand 
мне не совсем понятны, наверное потому, что у меня нет опыта программирования в Sql Server. И я считаю, что если человек взялся кому-то помогать, то должен довести начатое до конца, иначе какой смысл зря тратить своё и чужое время...
19 окт 11, 21:36    [11469376]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
Glory
Member

Откуда:
Сообщений: 104751
erman
Слушайте - не хотите помогать, то и не надо было начинать всё это, зачем вы забираете зря моё время...

Вот как оказывается, это ваше время тут забирают
А что бы могли сделать за это время, расскажите ?
19 окт 11, 21:44    [11469406]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
iljy
Member

Откуда:
Сообщений: 8711
erman,

ваши проблемы замечательны тем, что они исключительно ваши. Если вам непонятно в документации что-то конкретное, то задавайте конкретный вопрос.
19 окт 11, 22:03    [11469473]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
erman
Member

Откуда:
Сообщений: 409
Вот я переписал скрипт таким образом :
INSERT INTO Brands(brandOfCar) SELECT @brand WHERE NOT EXISTS(SELECT IdBrand FROM Brands WHERE Brands.brandOfCar = @brand);
SET @idBrand = @@IDENTITY
BEGIN
	IF(@idBrand <> NULL)
		SELECT @idBrand = IdBrand FROM Brands where Brands.brandOfCar = @brand; 
END
 
INSERT INTO Models(nameModel, brandId) SELECT @model, @idBrand WHERE NOT EXISTS(SELECT IdModel FROM Models WHERE Models.nameModel = @model);
SET @idModel = @@IDENTITY
BEGIN
	IF(@idModel <> NULL)
		SELECT @idModel = @idModel FROM Models where Models.nameModel = @model; 
END 

INSERT INTO Cars(brandId, color, volumeOfEngine, description, modelId) VALUES (@idBrand, @color, @volumeOfEngine, @description, @idModel);
SET @idCar = @@IDENTITY

При первом выполнении процедуры вставка значений в таблицы происходит нормально, но если я пытаюсь выполнить процедуру второй раз - получаю ошибку :
(0 row(s) affected)

(0 row(s) affected)
Msg 547, Level 16, State 0, Procedure InsertCar, Line 36
Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK__Cars__brandId__023D5A04". Конфликт произошел в базе данных "CatalogueCars", таблица "dbo.Brands", column 'IdBrand'.
Выполнение данной инструкции было прервано.
Отсюда у меня вывод : нарушения в связях здесь быть не может, так как первый раз всё срабатывает, а проблема, наверное, в переменных @idModel, @idBrand, которым не присваиваются значения. Почему это происходит, неправильно что-то написано или как?
19 окт 11, 22:45    [11469579]     Ответить | Цитировать Сообщить модератору
 Re: Вставка значений в несколько таблиц  [new]
^^
Guest
А вы хоть проверили что вам вернет
SELECT @brand WHERE NOT EXISTS(SELECT IdBrand FROM Brands WHERE Brands.brandOfCar = @brand);
???
и это даже не учитывая что вы привели не весь скрипт :)
19 окт 11, 23:56    [11469753]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить