PDA

View Full Version : پیدا کردن Gap های یک فیلد Identity



شاپرک
دوشنبه 20 فروردین 1386, 10:58 صبح
هر دو Query زیر لیست Gap های یک فیلد Identity یا نوع عدد (Unique) رو مشخص میکنه :


SELECT a.pkid + 1 as GapValue
FROM tblname a
WHERE NOT EXISTS( SELECT * FROM tblname b
WHERE b.pkid = a.pkid + 1 )
AND a.pkid < (select max(pkid) from tblname);




SELECT k.PKey + 1 AS GapVal
FROM tblname k LEFT OUTER JOIN
tblname r ON k.PKey + 1 = r.PKey
WHERE (r.PKey IS NULL)


من تابع یا sp ای میخوام که پارامتر اون نام جدول باشه و نتیجه اون اولین Gap .... ؟؟؟؟

AminSobati
دوشنبه 20 فروردین 1386, 11:29 صبح
اگر Sort کنین و TOP 1 بگیرین فکر میکنم مشکل حل بشه. ولی کنجکاوم که بدونم چرا باید GAP بدست بیاد؟ مگه از Identity بعنوان فیلد Rank استفاده میکنین؟

شاپرک
دوشنبه 20 فروردین 1386, 11:48 صبح
تو این مورد مشکلی ندارم حتی میشه min اش رو هم برداشت .
مشکل اینه نمی تونم نام جدول رو بصورت پارامتری کنم .

فیلد من Identity نیست و این روش هم فقط برای Identity نیست . با این روش میخوام خودم عدد بعدی رو تولید کنم . (کار Identity رو انجام بدم به شرطی که از Gap های ایجاد شده استفاده کنم .)

AminSobati
دوشنبه 20 فروردین 1386, 23:18 عصر
برای پارامتری کردنش راهی جز Dynamic SQL نیست. به چه علت باید Gapها پر بشه؟

شاپرک
سه شنبه 21 فروردین 1386, 08:46 صبح
برای اینکه مجبور نباشم فیلد Identity رو Reset کنم . (به عنوان فیلد Rank استفاده نمیکنم .)
چون در جدولم فیلد Unique ندارم یه Identity اضافه کردم اما مشکلی که بوجود اومد این بود که موقع Add کردن من باید هم به جدول اضافه کنم و هم به رکوردست چون نمیخوام رکوردست رو Requery یا Refresh کنم . Identity رو نتونستم با استفاده از Scope_Identity() به رکوردست Add کنم error میداد ...
در ضمن رکورد ست رو به صورت BatchOptimistic باز میکنم .

AminSobati
سه شنبه 21 فروردین 1386, 10:37 صبح
چطوره که به کمک SP یک رکورد خالی به جدول اضافه کنین و وقتی Identity گرفت اون رکورد رو به کلاینت بدین تا ویرایش کنه. به این شکل Identity سمت کلاینت مشخصه.

شاپرک
سه شنبه 21 فروردین 1386, 12:27 عصر
اگه همزمان چند نفر SP رو اجرا کنند ( MultiUser ) مشکلی بوجود نمیاد ؟

AminSobati
سه شنبه 21 فروردین 1386, 15:32 عصر
حسن Identity در اینه که چنین مشکلی نداره!

شاپرک
سه شنبه 21 فروردین 1386, 15:52 عصر
موقع اضافه کردن رکورد جدید بعد از Inser کردن به Table چطور مقدار Identity رو به رکوردست Add کنم ؟؟؟؟

AminSobati
سه شنبه 21 فروردین 1386, 22:14 عصر
شما رکورد رو Insert کنین، بعد با Scope Identity که براش تولید شده، Select کنین و بیارین سمت کلاینت توی Recordset

شاپرک
چهارشنبه 22 فروردین 1386, 10:29 صبح
Insert Query به جدول در Query Analayser مقدار Identity رو برمیگردونه اما تو برنامه هم از طریق Command و هم رکوردست مقدارش Empty میشه ...!!!!!!!!!!!!
دلیل خاصی ممکنه داشته باشه؟

AminSobati
چهارشنبه 22 فروردین 1386, 13:00 عصر
دقت کنین لطفا: عرض کردم Insert رو جدا انجام بدین (از طریق SP)، بعد داخل SP مقدار جدید Identity رو بدست بیارین، بوسیله اون رکورد جدید رو Select کنین و بیارین سمت کلاینت

شاپرک
چهارشنبه 22 فروردین 1386, 13:55 عصر
یه سوال دیگه :
transaction داخل SP لازمه ؟

AminSobati
چهارشنبه 22 فروردین 1386, 14:32 عصر
اساسا SQL Server بدون Transaction هیچ کاری انجام نمیده و تمام ویرایشهایی که توسط شما اتفاق میافته، توسط خود SQL Server داخل Transaction قرار میگیره و خودش هم Commit میکنه. مگر اینکه شروع و خاتمه رو بخواین دست خودتون بگیرین (بوسیله Begin Tran). دیگه بستگی به نیاز و قصد شما داره که بخوایم تصمیم بگیریم Transaction رو خودمون ایجاد کنیم یا SQL Server.

شاپرک
یک شنبه 26 فروردین 1386, 09:17 صبح
ممنون از تمام راهنمایی هاتون .