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

Откуда:
Сообщений: 125
Добрый день !
Есть таблица
CREATE TABLE  Order
(
	[NumOrder] [int] NOT NULL ,
	[IdClient] [int] NOT NULL 
)
Пишу процедуру импорта - имеется временная таблица с IdClient, после вставки необходимо вывести полученные номера заказов.
Делаю так:
declare @temp table (IdClient int, ForIdenity int identity(1,1))
insert into @temp table
{.. тут наполнение ...}
delcare @MaxIdentity int
set @MaxIdentity = (select max(NumOrder) from Order)
update @temp table set ForIdenity = ForIdenity + @MaxIdentity
insert into Order (NumOrder, IdClient)
select ForIdentity, IdClient from @temp
Но если произойдет вставка из другого коннекта, то произойдет ошибка.
Вот и не знаю как решается правильно такая задача, может есть идеи ?
Спасибо.
15 окт 09, 11:32    [7789602]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

Откуда:
Сообщений: 125
Забыл сказать
Microsoft SQL Server 2000 - 8.00.2040 (Intel X86) May 13 2005 18:33:17 Copyright (c) 1988-2003 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
15 окт 09, 11:33    [7789616]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
версия сервера?
--------------------------------------------------------------
Дьявол кроется в деталях.
15 окт 09, 11:34    [7789622]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
почему NumOrder не является identity ?
15 окт 09, 11:35    [7789641]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
aleks2
Guest
DenisVa,

Правильное решение: вставлять прямо в целевую таблицу с полем IDENTITY в ней. Ибо так и следует использовать IDENTITY.

Как результат - никаких конфликтов с другими вставками.
15 окт 09, 11:35    [7789642]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

Откуда:
Сообщений: 125
Сейчас невозможно сделать это поле как identity, ибо это доисторическая таблица, и много с ней связано вставок из доисторической программы.
Рассматривал вариант добавить identity поле еще одно рядышком, но все равно не знаю как тогда идентифицировать добавленные записи в данном scope.
15 окт 09, 11:38    [7789657]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
aleks2
Guest
DenisVa
Сейчас невозможно сделать это поле как identity, ибо это доисторическая таблица, и много с ней связано вставок из доисторической программы.
Рассматривал вариант добавить identity поле еще одно рядышком, но все равно не знаю как тогда идентифицировать добавленные записи в данном scope.


CREATE TABLE  Order
(
	[NumOrder] [int] NOT NULL ,
	[IdClient] [int] NOT NULL 
, scopeID uniqueidentifier
, [id] int identity
)

declare @scopeID uniqueidentifier
set @scopeID=newid()

insert Order(...,scopeID )
select ..., @scopeID

select * from Order WHERE scopeID=@scopeID
15 окт 09, 11:41    [7789698]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

Откуда:
Сообщений: 125
То же обдумывалось, но не охота было поле новое делать. Ну раз больше никакого решения нет, то наверное так и придется ...
15 окт 09, 11:44    [7789716]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31170
DenisVa
Но если произойдет вставка из другого коннекта, то произойдет ошибка.
Вот и не знаю как решается правильно такая задача, может есть идеи ?
Спасибо.
А вы заблокируйте её, и не будет ошибки
15 окт 09, 11:46    [7789739]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
aleks2
Guest
ежели надо без декларации переменных

insert Order(..., scopeID )
select T...,  SI.scopeID 
from ... T CROSS JOIN (select newid() scopeID) SI

select * from Order WHERE scopeID=(select scopeID from Order where id=SCOPE_IDENTITY())
15 окт 09, 11:46    [7789751]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

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

буду блокировать значит. Просто страшно немного это делать )))) у нас коллективная разработка ))) кто-нибудь направит там. Спасибо всем, просто думал может есть какие-нибудь хитрости типа update-а двух табличек в одном statment-е(только без триггеров, да и триггер в процедуре нельзя создавать) или еще что ...
Спасибо
15 окт 09, 11:49    [7789778]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
aleks2
Guest
alexeyvg
DenisVa
Но если произойдет вставка из другого коннекта, то произойдет ошибка.
Вот и не знаю как решается правильно такая задача, может есть идеи ?
Спасибо.
А вы заблокируйте её, и не будет ошибки

А вот это НЕПРАВИЛЬНОЕ решение.
15 окт 09, 11:49    [7789790]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

Откуда:
Сообщений: 125
aleks2
...
А вот это НЕПРАВИЛЬНОЕ решение.

почему ?
15 окт 09, 11:50    [7789799]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
aleks2
Guest
DenisVa
aleks2
...
А вот это НЕПРАВИЛЬНОЕ решение.

почему ?

Любая блокировка хуже, чем отсутствие блокировки. Это аксиома.
15 окт 09, 12:49    [7790368]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
_Yason_
Guest
aleks2,

если бы не было блокировок, то и атомарности и соответственно транзакций
15 окт 09, 13:26    [7790720]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
а может?
Guest
?
[/src]Пишу процедуру импорта - имеется временная таблица с IdClient, после вставки необходимо вывести полученные номера заказов.
Делаю так:
declare @temp table (IdClient int, ForIdenity int identity(1,1))
insert into @temp table
{.. тут наполнение ...}
insert into Order (NumOrder, IdClient)
select r.Num+t.ForIdenity , t.IdClient from @temp t cross join (select max(NumOrder) Num from Order) r
15 окт 09, 21:35    [7793871]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
aleks2
Guest
_Yason_
aleks2,

если бы не было блокировок, то и атомарности и соответственно транзакций


Это еще не повод плодить блокировки ручками.
16 окт 09, 06:52    [7794540]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31170
aleks2
_Yason_
aleks2,

если бы не было блокировок, то и атомарности и соответственно транзакций


Это еще не повод плодить блокировки ручками.
Да почему же не повод???

В данном случае нужно нужно среди разных решений выбрать оптимальное (т.е. самое хорошее по соотношению цена/качество).

Почему решение с блокировкой не самое лучьшее в данном случае? Понять это можно, только зная бизнес-требования и конкретные технические детали.

Стоимость решения с блокировкой, очевидно, самая маленькая, и если вариант с блокировкой будет приемлим по производительности хотя бы лет на 5-10, то его и нужно использовать.

Или вы используете для принятия решений какие-то другие критерии?
16 окт 09, 10:46    [7795195]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

Откуда:
Сообщений: 125
По соотношению цена - качества был выбрано решение с блокировкой.
И в нашей ситуации - наиболее верное решение.
16 окт 09, 13:02    [7796346]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
ветерочек
Member

Откуда: СПБ
Сообщений: 153
а чем это не понравилось?
а может?
?
declare @temp table (IdClient int, ForIdenity int identity(1,1))
insert into @temp table
{.. тут наполнение ...}
insert into Order (NumOrder, IdClient)
select r.Num+t.ForIdenity , t.IdClient from @temp t cross join (select max(NumOrder) Num from Order) r
16 окт 09, 13:27    [7796607]     Ответить | Цитировать Сообщить модератору
 Re: Помогите решить задачу с выборкой после вставки  [new]
DenisVa
Member

Откуда:
Сообщений: 125
ветерочек
а чем это не понравилось?
а может?
?
declare @temp table (IdClient int, ForIdenity int identity(1,1))
insert into @temp table
{.. тут наполнение ...}
insert into Order (NumOrder, IdClient)
select r.Num+t.ForIdenity , t.IdClient from @temp t cross join (select max(NumOrder) Num from Order) r

потому что
отсюда невозможно вытащить полученные номера заказов, смысл как раз в этом
16 окт 09, 17:46    [7798677]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить