Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возврат значения поля Identity [D7, MSSQL]


Страницы:   1 2

FH ©   (2005-10-01 11:34:00) 

Я в клиенте добавляю строку в таблице, где
Identityу поля [id] = Yes.
Мне надо тут же в клиенте знать, какой [id] присвоил сервер этой записи. Не хочется делать дополнительный запрос и не хочется самому реализовывать механизм присвоения значения поля Identity. Может, в ADO это реализовано, но я этого не знаю?


Курдль   (2005-10-03 11:34:00) [1]


> Declare @X int
>
> Insert into MasterTable(MTName) Values ('1111')
> Select @X=@@Identity
> Insert into DetailTable(MTID, DetName) values (@X, '22222')
> Insert into DetailTable(MTID, DetName) values (@X, '33333')
>


Ок! Вполне приемлемо!


Zz_   (2005-10-03 11:30:00) [2]

>>Ведь 2 строчки скрипта IB Вам пришлось реализовать 9-ю строчками.

Вывод неверен.


Ega23   (2005-10-03 11:28:00) [3]

запись одной строки в мастер-таблицу и 2-х - в подчиненные таблицы, совсем не реализована.


Create Table MasterTable
(
MTID int Identity(0,1)
MTName varchar(64)
)

Create Table DetailTable
(
DetID int Identity(0,1)
MTID int
DetName varchar(64)
)

Declare @X int

Insert into MasterTable(MTName) Values ('1111')
Select @X=@@Identity
Insert into DetailTable(MTID, DetName) values (@X, '22222')
Insert into DetailTable(MTID, DetName) values (@X, '33333')


?


Курдль   (2005-10-03 11:24:00) [4]


> Простите великодушно, уж не соглашусь.


Позвольте полюбопытствовать, почему?
Ведь 2 строчки скрипта IB Вам пришлось реализовать 9-ю строчками.
К тому же, моя идея, которую я хотел донести, - запись одной строки в мастер-таблицу и 2-х - в подчиненные таблицы, совсем не реализована.


Zz_   (2005-10-03 11:17:00) [5]

>>А ведь согласитесь, что Ваш примерчик - это "per rectum"! :)

Простите великодушно, уж не соглашусь.


Курдль   (2005-10-03 11:15:00) [6]


> ЗЫ. Какой-то ты озабоченный. Может к врачу сходить ?


Да я и вправду озабоченный! Все пытаюсь понять для себя, можно ли принимать MS SQL, как возможную СУБД для своих проектов, или совсем распрощаться до выхода работоспособного Yukon-а?..

А ведь согласитесь, что Ваш примерчик - это "per rectum"! :)


Zz_   (2005-10-03 11:09:00) [7]

--insert into SUBJECTS (SBJ_ID, SBJ_NAME)
--values (Gen_ID('GEN_SBJ', 1), '"ОАО "Инвестбанк"');

create table #t (SBJ_ID int identity(1,1), SBJ_NAME varchar(100))
insert into #t(SBJ_NAME)values ('"ОАО "Инвестбанк 1"');

set identity_insert #t on
insert into #t(SBJ_ID, SBJ_NAME)values (11,'"ОАО "Инвестбанк 2"');
insert into #t(SBJ_ID, SBJ_NAME)values (12,'"ОАО "Инвестбанк 3"');

set identity_insert #t off
insert into #t(SBJ_NAME)values ('"ОАО "Инвестбанк 4"');

select * from #t

drop table #t


ЗЫ. Какой-то ты озабоченный. Может к врачу сходить ?


Курдль   (2005-10-03 10:57:00) [8]

Я навскидочку придумал скрипт заливки каких-то данных для 3-х субд.
Не забожусь, что он идеален и без ошибок, но по сути правильный.
Можно ли его повторить для MS SQL?

oracle:

insert into SUBJECTS (SBJ_ID, SBJ_NAME)
values(SEQ_SBJ.NEXTVAL, '"ОАО "Инвестбанк"')
/
insert into ADDRESSES(ADR_TYPE, SBJ_ID, ADR_TEXT)
values('Фактический', SEQ_SBJ.CURRVAL, 'Урюпинск, ул.Ленина, 1')
/
insert into LICENSES(LIC_ID, SBJ_ID, LIC_NUM)
values(SEQ_LIC.NEXTVAL, SEQ_SBJ.CURRVAL, '225-78/452')
/


sybase:

insert into SUBJECTS (SBJ_ID, SBJ_NAME)
select Get_Identity('SUBJECTS'), '"ОАО "Инвестбанк"' from DUMMY;

insert into ADDRESSES(ADR_TYPE, SBJ_ID, ADR_TEXT)
select 'Фактический', Get_Identity('SUBJECTS', 0), 'Урюпинск, ул.Ленина, 1'  from DUMMY;

insert into LICENSES(LIC_ID, SBJ_ID, LIC_NUM)
select Get_Identity('LICENSES'), Get_Identity('SUBJECTS', 0), '225-78/452' from DUMMY;


interbase:

insert into SUBJECTS (SBJ_ID, SBJ_NAME)
values (Gen_ID('GEN_SBJ', 1), '"ОАО "Инвестбанк"');

insert into ADDRESSES(ADR_TYPE, SBJ_ID, ADR_TEXT)
values ('Фактический', Gen_ID('GEN_SBJ', 0), 'Урюпинск, ул.Ленина, 1');

insert into LICENSES(LIC_ID, SBJ_ID, LIC_NUM)
values (Gen_ID('GEN_LIC', 1), Gen_ID('GEN_SBJ', 0), '225-78/452');


ANB   (2005-10-03 10:54:00) [9]


> sniknik ©   (03.10.05 10:46) [15]

Ессно, оставлю. Я вообще этот проект больше трогать не буду - он закрыт и все денежки получены.


sniknik   (2005-10-03 10:46:00) [10]

> - ADOCommand или ADOConnect
сорри конечно же ADOConnection

> Я использовал именно ADOConnec и ничего не получалось, пока в одну команду не запихнул.
пусть так остается так правильней (нет вероятности что между этими командами вклинится чтото с другого клиента)
а вот то что не работало это у тебя от чегото другого.


ANB   (2005-10-03 10:42:00) [11]


> sniknik ©   (03.10.05 10:40) [13]
-
> ADOCommand

- ADOCommand или ADOConnect ? Я использовал именно ADOConnect и ничего не получалось, пока в одну команду не запихнул.


sniknik   (2005-10-03 10:40:00) [12]

будет работать(вернет) даже если в 2 разных запроса.
про коннект совершенно правильно, все дожно быть в одном, при переконекте все переменные сбрасывают значения.
у кого не получается тот значит не пользуется ADOCommand (что вообщето настоятельно рекомендовано к использованю), а пишут строки коннекта непосредственно у компонент (в этом случае конект пересоздается при открытии каждого компонента и все сбрасывается).


ANB   (2005-10-03 10:33:00) [13]


> Ega23 ©   (03.10.05 10:27) [11]
- там чуть хитрее. Если даже открыть транзакцию, и выполнять все последовательно (одельно инсерт, отдельно селект), то все равно ничего не получиться. Насколько мне объясняли ребята в Нижнем, у MS SQL есть еще понятие коннекта. Так вот эти операторы должны быть в одном коннекте.


Ega23   (2005-10-03 10:27:00) [14]

- абослютно правильно понял. Причем select нужно вставлять в тот же запрос, что и инсерт и выполнять через Open. Иначе ничего работать не будет.

Я бы даже добавил, что в одну транзакцию, а не запрос.


ANB   (2005-10-03 10:23:00) [15]


> Курдль ©   (03.10.05 10:19) [9]
- абослютно правильно понял. Причем select нужно вставлять в тот же запрос, что и инсерт и выполнять через Open. Иначе ничего работать не будет.


Курдль   (2005-10-03 10:19:00) [16]

Я правильно понял, что идентификатор можно получить только после insert DML?


Ega23   (2005-10-03 10:15:00) [17]

Последний.
Хотя в MS SQL 2000 есть уже функция SCOPE_IDENTITY.

SCOPE_IDENTITY
Returns the last IDENTITY value inserted into an IDENTITY column in the same scope. A scope is a module -- a stored procedure, trigger, function, or batch. Thus, two statements are in the same scope if they are in the same stored procedure, function, or batch.

Syntax
SCOPE_IDENTITY( )

Return Types
sql_variant

Remarks
SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions in that they return values inserted into IDENTITY columns.

IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT returns the value generated for a specific table in any session and any scope. For more information, see IDENT_CURRENT.

SCOPE_IDENTITY and @@IDENTITY will return last identity values generated in any table in the current session. However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

For example, you have two tables, T1 and T2, and an INSERT trigger defined on T1. When a row is inserted to T1, the trigger fires and inserts a row in T2. This scenario illustrates two scopes: the insert on T1, and the insert on T2 as a result of the trigger.

Assuming that both T1 and T2 have IDENTITY columns, @@IDENTITY and SCOPE_IDENTITY will return different values at the end of an INSERT statement on T1.

@@IDENTITY will return the last IDENTITY column value inserted across any scope in the current session, which is the value inserted in T2.

SCOPE_IDENTITY() will return the IDENTITY value inserted in T1, which was the last INSERT that occurred in the same scope. The SCOPE_IDENTITY() function will return the NULL value if the function is invoked before any insert statements into an identity column occur in the scope.

See Examples for an illustration.

Examples
This example creates two tables, TZ and TY, and an INSERT trigger on TZ. When a row is inserted to table TZ, the trigger (Ztrig) fires and inserts a row in TY.

USE tempdb
GO
CREATE TABLE TZ (
  Z_id  int IDENTITY(1,1)PRIMARY KEY,
  Z_name varchar(20) NOT NULL)

INSERT TZ
  VALUES ('Lisa')
INSERT TZ
  VALUES ('Mike')
INSERT TZ
  VALUES ('Carla')

SELECT * FROM TZ

--Result set: This is how table TZ looks
Z_id   Z_name
-------------
1      Lisa
2      Mike
3      Carla

CREATE TABLE TY (
  Y_id  int IDENTITY(100,5)PRIMARY KEY,
  Y_name varchar(20) NULL)

INSERT TY (Y_name)
  VALUES ('boathouse')
INSERT TY (Y_name)
  VALUES ('rocks')
INSERT TY (Y_name)
  VALUES ('elevator')

SELECT * FROM TY
--Result set: This is how TY looks:
Y_id  Y_name
---------------
100   boathouse
105   rocks
110   elevator

/*Create the trigger that inserts a row in table TY
when a row is inserted in table TZ*/
CREATE TRIGGER Ztrig
ON TZ
FOR INSERT AS
  BEGIN
  INSERT TY VALUES ('')
  END

/*FIRE the trigger and find out what identity values you get
with the @@IDENTITY and SCOPE_IDENTITY functions*/
INSERT TZ VALUES ('Rosalie')

SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY]
GO
SELECT   @@IDENTITY AS [@@IDENTITY]
GO

--Here is the result set.
SCOPE_IDENTITY
4
/*SCOPE_IDENTITY returned the last identity value in the same scope, which was the insert on table TZ*/

@@IDENTITY
115
/*@@IDENTITY returned the last identity value inserted to TY by the trigger, which fired due to an earlier insert on TZ*/


Курдль   (2005-10-03 10:11:00) [18]


> Ega23 ©   (03.10.05 09:54) [6]
> Нет. На каждую - свой.


И какой из них выдаст "select @@identity"?


Ega23   (2005-10-03 09:54:00) [19]

Объясните мне, - серому и убогому, в MS SQL-е один identity на все таблицы?

Нет. На каждую - свой.


Курдль   (2005-10-03 09:51:00) [20]


> Anatoly Podgoretsky ©   (01.10.05 12:36) [1]
> select @@identity


Объясните мне, - серому и убогому, в MS SQL-е один identity на все таблицы?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо