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

Откуда:
Сообщений: 2
Прошу помощи.
Имеется запрос на создание хп:

USE [asd]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
CREATE PROCEDURE [dbo].[ChildInsert]
(
    @LastName VARCHAR(MAX),
    @FirstName VARCHAR(MAX),
    @Otchestvo VARCHAR(MAX),
    @Sex VARCHAR(MAX),
    @MotherName VARCHAR(MAX),
    @FatherName VARCHAR(MAX),
    @HomeAdress VARCHAR(MAX),
    @YZname VARCHAR(MAX),
    
    @PhoneNumber INT,
    @ChildCode INT,
    @YZCode INT,
    
    @BornDate datetime
)
AS
BEGIN
    SET NOCOUNT ON;
    
    SET @YZCode = (SELECT Код_УЗ FROM УЗ);
    
    INSERT INTO Одаренные_дети ([Фамилия] ,[Имя], [Отчество], [Пол], [ФИО_матери], [ФИО_отца], [Дамашний_адресс], [Наиминование_УЗ], [Телефон], [Дата_рождения])
    VALUES (@LastName, @FirstName, @Otchestvo, @Sex, @MotherName, @FatherName, @HomeAdress, @YZname, @PhoneNumber, @BornDate);
 
        SET @ChildCode = (SELECT Код_ребёнка FROM Одаренные_дети);
    
    INSERT INTO Одаренные_дети_УЗ ([Код_ребёнка] ,[Код_УЗ])
    VALUES (@ChildCode, @YZCode);
END


После первого INSERT мне нужно получить присвоенный этой записи Код_ребёнка, который является автогенерируемым, и записать во 2-ую таблицу.
Как это можно сделать?
28 май 16, 21:58    [19231649]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
=Сергей=
Member

Откуда:
Сообщений: 336
declare @id int

после инсерта

select @id = @@identity
28 май 16, 23:06    [19231818]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
Leprikon
Member

Откуда:
Сообщений: 2
=Сергей=, Спасибо
28 май 16, 23:57    [19231962]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
=Сергей=
declare @id int

после инсерта

select @id = @@identity
@@identity зло и грабли. scope_identity() или через output.
29 май 16, 13:24    [19232447]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Гавриленко Сергей Алексеевич
=Сергей=
declare @id int

после инсерта

select @id = @@identity
@@identity зло и грабли. scope_identity() или через output.
При определённых обстоятельствах всё - зло и грабли!
Ситуация с @@IDENTITY, помогите отловить
29 май 16, 16:37    [19232732]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iap
Гавриленко Сергей Алексеевич
пропущено...
@@identity зло и грабли. scope_identity() или через output.
При определённых обстоятельствах всё - зло и грабли!
Ситуация с @@IDENTITY, помогите отловить
Даже output зло?
29 май 16, 18:12    [19232905]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Гавриленко Сергей Алексеевич
iap
пропущено...
При определённых обстоятельствах всё - зло и грабли!
Ситуация с @@IDENTITY, помогите отловить
Даже output зло?
Аналогично SCOPE_IDENTITY() себя ведёт!
То есть, не фурычит, если есть триггер INSTEAD OF INSERT
29 май 16, 18:15    [19232913]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
Гавриленко Сергей Алексеевич
пропущено...
Даже output зло?
Аналогично SCOPE_IDENTITY() себя ведёт!
То есть, не фурычит, если есть триггер INSTEAD OF INSERT

OUTPUT вообще не будет работать и ругаться если триггер INSTEAD OF
30 май 16, 09:10    [19234276]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
TaPaK
iap
пропущено...
Аналогично SCOPE_IDENTITY() себя ведёт!
То есть, не фурычит, если есть триггер INSTEAD OF INSERT

OUTPUT вообще не будет работать и ругаться если триггер INSTEAD OF
Работает, ести OUTPUT в таблицу
USE tempdb;
GO
CREATE TABLE T(ID INT NOT NULL IDENTITY, V INT NULL);
GO
CREATE TRIGGER TriggerInsteadOfInsert_T ON T INSTEAD OF INSERT AS INSERT T(V)SELECT V FROM inserted;
GO

DECLARE @T TABLE(ID INT, V INT);
INSERT T(V)OUTPUT inserted.ID, inserted.V INTO @T VALUES(0),(3);
SELECT * FROM @T;
DROP TABLE T;
30 май 16, 11:34    [19235140]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap,

и что в результате в ID?
30 май 16, 11:40    [19235187]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
раньше и не задумывался, но вот

автор
For INSTEAD OF triggers, the returned results are generated as if the INSERT, UPDATE, or DELETE had actually occurred, even if no modifications take place as the result of the trigger operation. If a statement that includes an OUTPUT clause is used inside the body of a trigger, table aliases must be used to reference the trigger inserted and deleted tables to avoid duplicating column references with the INSERTED and DELETED tables associated with OUTPUT.

имхо INSEAD OF + OUTPUT себе проблем добавлять
30 май 16, 11:50    [19235270]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
TaPaK
iap,

и что в результате в ID?
В Т всё в порядке, а в @T - ID=0. По приведённой ссылке я уже удивлялся по этому поводу,
потому что в SQL2005 был не 0, а NULL. И это было более правильно, ибо 0 - это вполне себе нормальное значение IDENTITY,
например, в при первой вставке с IDENTITY(0,1).
30 май 16, 12:13    [19235456]     Ответить | Цитировать Сообщить модератору
 Re: Добавление данных в 2 связанные таблицы  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
iap
TaPaK
iap,

и что в результате в ID?
В Т всё в порядке, а в @T - ID=0. По приведённой ссылке я уже удивлялся по этому поводу,
потому что в SQL2005 был не 0, а NULL. И это было более правильно, ибо 0 - это вполне себе нормальное значение IDENTITY,
например, в при первой вставке с IDENTITY(0,1).

т.е. получение "какого-то" результата, это тоже результат, ну ок
30 май 16, 12:16    [19235491]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить