Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Вниз

Возврат значения поля Identity   Найти похожие ветки 

 
FH   (2005-10-01 11:34) [0]

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


 
Anatoly Podgoretsky ©   (2005-10-01 12:36) [1]

select @@identity


 
Max Zyuzin ©   (2005-10-01 13:13) [2]

Без неделанья запроса никак не получится... правильный ответ Anatoly Podgoretsky ©   (01.10.05 12:36) [1]  Почитай BOL там еще есть некоторые разновидности такого способа.


 
sniknik ©   (2005-10-01 21:35) [3]

получится и с неделанием. сам сгенерится автоматом, при post при добавлении записи в рекодсете если поле имеет тип автоинкремент оно перезапрашивается. и делать ничего не надо, такое поведение по умолчанию.
вот если обновлять надо все поля (часть значений дефолтных/расчетных на сервере) тогда другое дело - см. статьи про адо на королевстве дельфи, там есть как это сделать (заодно и вобшем просветишся ;).

кстати перезапрос идет именно @@identity, что не очень хорошо, если вдруг есть тригер в котором тоже есть вставки, в другие таблици конечно... приходится изврашатся, тригер переписывать, чтобы значение не сбивалось, а было бы через "карент_идентити" и проблем бы не было...


 
FH   (2005-10-02 09:32) [4]

Спасибо


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


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


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


 
Ega23 ©   (2005-10-03 09:54) [6]

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

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


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


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


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


 
Ega23 ©   (2005-10-03 10:15) [8]

Последний.
Хотя в 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:19) [9]

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


 
ANB ©   (2005-10-03 10:23) [10]


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


 
Ega23 ©   (2005-10-03 10:27) [11]

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

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


 
ANB ©   (2005-10-03 10:33) [12]


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


 
sniknik ©   (2005-10-03 10:40) [13]

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


 
ANB ©   (2005-10-03 10:42) [14]


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

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


 
sniknik ©   (2005-10-03 10:46) [15]

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

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


 
ANB ©   (2005-10-03 10:54) [16]


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

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


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

Я навскидочку придумал скрипт заливки каких-то данных для 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");


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

--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 11:15) [19]


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


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

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


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

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

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


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


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


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


 
Ega23 ©   (2005-10-03 11:28) [22]

запись одной строки в мастер-таблицу и 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")


?


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

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

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


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


> 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")
>


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



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.52 MB
Время: 0.04 c
5-1109873176
MadLesS
2005-03-03 21:06
2005.11.13
Как создать свой конструктор с другими параметрами?


8-1119575270
Dr. Andrew
2005-06-24 05:07
2005.11.13
Как можно проверить занят ли аудио файл другим процессом?


1-1129828333
Dwen
2005-10-20 21:12
2005.11.13
создание и распечатка таблицы из memo


14-1129816274
flipper
2005-10-20 17:51
2005.11.13
Никто не может зайти в компик (хр)


14-1129979702
alless
2005-10-22 15:15
2005.11.13
Как запускать файлы *.bin?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский