ورود

View Full Version : طریقه بدست آوردن IdentityID جدید



bardia goharbin
پنج شنبه 12 بهمن 1385, 13:38 عصر
من در یک Table توسط یک Procedure رکوردی را Insert میکنم که فیلد ID آن Identiy است
بعد از این کار به مقدار این فیلد نیاز دارم که در Table های دیگری تغییراتی را بدهم.
چگونه مقدار این فیلد ID را بدست آورم؟

ali_kolahdoozan
پنج شنبه 12 بهمن 1385, 13:41 عصر
identity@@
شما با کمک این متغیر سیستمی می تونید این مقدار رو به دست بیارید

bardia goharbin
پنج شنبه 12 بهمن 1385, 13:42 عصر
یعنی حتی قبل از اضافه کردن رکورد هم میتوان آنرا بدست آورد؟

ali_kolahdoozan
پنج شنبه 12 بهمن 1385, 13:47 عصر
نه بعد از آن است . قبلش صفر است

SabaSabouhi
پنج شنبه 12 بهمن 1385, 13:50 عصر
با سلام
خیر، تا پیش از Insert هنوز Identity Value براى سطر جدید در نظر گرفته نمى‌شود. فقط پس از عمل Insert مى‌توانید به آن دسترسى پیدا کنید.
نکته:
اگر از Trigger استفاده مى‌کنید و ممکن است در Trigger به جدول دیگرى رکورد اضافه شود از Identity@@ استفاده نکنید چون آخرین Identity ایجاد شده را بدون توجه به جدول برمى‌گرداند. در این حالت به‌تر است از ('Ident_Current( 'TableName استفاده کنید.

صبا صبوحى

ali_kolahdoozan
پنج شنبه 12 بهمن 1385, 13:52 عصر
صبوحی جان توضیح بده . راهت یه جورهایی مشکوک میزنه درست باشه . توضیح یادتون نره مرسی

AminSobati
پنج شنبه 12 بهمن 1385, 14:55 عصر
منظور خانم صبوحی این هست:


use tempdb
go

create table t1(
c1 int identity (1,1),
c2 int)
go

create table t2(
c1 int identity (100,1),
c2 int)
go

create trigger tr1 on t1 after insert
as
insert t2 values(1)
go

insert t1 values(-1)
select @@identity

شما در دستور Select آخر عدد 100 رو خواهید دید که حاصل Insert به t2 هستش، اما ('Ident_Current( 'TableName هم جواب قطعی نیست به این دلیل که ممکنه Trigger کارش کمی زمان صرف کنه و در همین مدت کاربر دیگه ای با Insert باعث افزایش Identity روی t1 بشه، به همین دلیل scope_identity برای این منظور مناسب تره. اساسا scope_identity رو توصیه میکنم مگر اینکه کاملا دانسته از Identity@@ یا Ident_Current استفاده بشه

bardia goharbin
پنج شنبه 12 بهمن 1385, 18:28 عصر
من از Trigger استفاده نمیکنم آیا همان identity@@ برای من در آینده مشکل ایجاد نخواهد کرد؟

AminSobati
پنج شنبه 12 بهمن 1385, 18:54 عصر
چرا، بعدا اگر نیاز شد Trigger بنویسید (که خیلی هم احتمال داره) باید دست و دلتون بلرزه که Insert نکنین و اینکه کدهای نوشته شده در قبل، درست کار کنن! پس بهتره از الان صحیح و اصولی کار کنین

Microsoft.net
پنج شنبه 12 بهمن 1385, 19:33 عصر
شفافتر بگم Identity@@ آخرین Identity ذخیره شده در تمام table ها توسط یوزر فعلی (اگه یوزر دیگه ای همزمان insert کنه تاثیری نداره) و () scope_identity آخرین Identity ذخیره شده در table ی که عمل اضافه داره روش انجام میشه رو میده
در ضمن اگه از transaction ها استفاده میکنید نکته جالب اینه که قبل از اضافهidentity رو ابتدا رزرو میکنند و سپس در اختیار کاربر قرار میدن در نتیجه هیچ مشکلی پیش نمیاد

AminSobati
پنج شنبه 12 بهمن 1385, 20:56 عصر
شفافتر بگم Identity@@ آخرین Identity ذخیره شده در تمام table ها توسط یوزر فعلی (اگه یوزر دیگه ای همزمان insert کنه تاثیری نداره) و () scope_identity آخرین Identity ذخیره شده در table ی که عمل اضافه داره روش انجام میشه رو میده
در ضمن اگه از transaction ها استفاده میکنید نکته جالب اینه که قبل از اضافهidentity رو ابتدا رزرو میکنند و سپس در اختیار کاربر قرار میدن در نتیجه هیچ مشکلی پیش نمیاد
دوست عزیزم تعریفتون کمی بحث برانگیزه. البته شاید شما هم منظور بنده رو داشته باشید، ببینید:

- Identity@@ آخرین Identity تولید شده توسط کاربر، بدون در نظر گرفتن Scope (اینکه داخل SP بوده یا Trigger یا ...) رو برمیگردونه.

- scope_identity آخرین Identity تولید شده توسط کاربر، در Scope فعلی رو برمیگردونه، یعنی اگر در یک Scope دیگه (مثل SP تو در تو، یا Triggger) یک Identity جدید بوسیله کاربر تولید شده باشه، روی scope_identity تاثیر نداره. اینکه بگیم "آخرین Identity ذخیره شده در table ی که عمل اضافه داره روش انجام میشه رو میده" از دید SQL Server معنی نداره، چون یک عمل Insert در یک مقطع زمانی اتفاق میافته، "داره روش انجام میشه" تعریف نشده است!

- Ident_Current بدون اینکه کاربر Insertی انجام بده، جدیدترین Identity تولید شده روی جدول مورد نظر رو برمیگردونه. لذا کار کاربران همزمان روی مقدار اون تاثیر داره

bardia goharbin
پنج شنبه 12 بهمن 1385, 21:09 عصر
پس بالاخره من از چی استفاده کنم که کاربران همزمان مشکلی نداشته باشن.
من از Identity@@ استفاده کردم، هرچه باداباد. اگه روزی به مشکل برخوردم میام همینجا میگم
از همه شما هم بسیار ممنونم

AminSobati
پنج شنبه 12 بهمن 1385, 22:07 عصر
عرض کردم که scope_identity ! ولی شما مختارین

SabaSabouhi
شنبه 14 بهمن 1385, 14:49 عصر
صبوحی جان توضیح بده . راهت یه جورهایی مشکوک میزنه درست باشه . توضیح یادتون نره مرسی

با سلام
ببخشید یه کم دیر شد. با توجه به توضیح‌هاى خوبى که دوستان دادن گمان نکنم چیز زیادى براى گفتن باقى باشه، اما باز اگر کمکى از دست من بربیاد در خدمت هستم.

صبا صبوحى

پ.ن: قابل توجه دوست عزیز آقاى ثباتى، من آقاى صبوحى هستم و نه خانم صبوحى :لبخندساده:

AminSobati
شنبه 14 بهمن 1385, 18:14 عصر
پ.ن: قابل توجه دوست عزیز آقاى ثباتى، من آقاى صبوحى هستم و نه خانم صبوحى :لبخندساده:

عذر خواهی بنده رو بپذیرید دوست عزیزم!