PDA

View Full Version : سوال: SCOPE_IDENTITY



s_mokhtari
چهارشنبه 27 مرداد 1389, 17:11 عصر
با سلام:کف::کف:
ضمن تشكر از sinpin من اين كد رو استفاده كردم ولي فقط بعد از درج ركورد جديد مقدار آخرين ركورد رو ميده من ميخوام حتي وقتي چيزي درج نشده هم بتونم آخرين ركورد جاري رو شمارشو بدست بيارم
با اين كد ميشه
يا راه ديگه بايد در نظر بگيرم
دوستان راهنماييم كنيد
مممممممممنون:چشمک::چشمک:

علیرضا مداح
چهارشنبه 27 مرداد 1389, 18:17 عصر
سلام،
منظور شما کدام کدهاست؟
،/

محمد سلیم آبادی
چهارشنبه 27 مرداد 1389, 23:17 عصر
تابع Ident_Current را امتحان کنید.
چیزی شبیه به کد زیر:

SELECT IDENT_CURRENT('table_name') AS last_identity_value;

s_mokhtari
پنج شنبه 28 مرداد 1389, 10:33 صبح
سلام،
منظور شما کدام کدهاست؟
،/
با سلام
منظورم اين كد
INSERT INTO tbl_customer (name,hamrah) VALUES ('sssss',45)

print SCOPE_IDENTITY()
ممنون

s_mokhtari
پنج شنبه 28 مرداد 1389, 10:46 صبح
تابع Ident_Current را امتحان کنید.
چیزی شبیه به کد زیر:

SELECT IDENT_CURRENT('table_name') AS last_identity_value;
با سلام و خسته نباشيد
از راهنمايي شما ممنون
ولي اگه فيلد از نوع autonumber نباشه چطوري مقدار آخرين فيلد رو بدست بيارم به جز تابع مكس راه ديگه اي هست
ممممممممننن:تشویق::تشویق:

محمد سلیم آبادی
پنج شنبه 28 مرداد 1389, 11:08 صبح
با سلام و خسته نباشيد
از راهنمايي شما ممنون
ولي اگه فيلد از نوع autonumber نباشه چطوري مقدار آخرين فيلد رو بدست بيارم به جز تابع مكس راه ديگه اي هست
ممممممممننن:تشویق::تشویق:

منظورتون را متوجه نمیشم. مگه فیلدتون identity نیست؟ اگر نبوده چرا از تابع scope استفاده می کردین؟

یکم بیشتر راجب نوع ستونی که در موردش صحبت می کنید بگید. آیا مقدار این ستون افزایشی هست؟ اگر افزایشی هست خب هم از max میشه و هم از top اینکار کرد.

s_mokhtari
پنج شنبه 28 مرداد 1389, 11:27 صبح
منظورتون را متوجه نمیشم. مگه فیلدتون identity نیست؟ اگر نبوده چرا از تابع scope استفاده می کردین؟

یکم بیشتر راجب نوع ستونی که در موردش صحبت می کنید بگید. آیا مقدار این ستون افزایشی هست؟ اگر افزایشی هست خب هم از max میشه و هم از top اینکار کرد.
با سلام:لبخندساده:
من ميخوام هر دو نوع رو بدونم يك اينكه نوع ستونم identity كه شما راهنماييم كرديد يك نوع ديگشم اينكه نميخوام identity باشه يعني براي اضافه كردن ركورد هميشه ميخوام مقدار آخر اين فيلد رو داشته باشم كه از تابع مكس استفاده ميكردم ولي با تحقيقي كه كردم ميگن اين تابع براي ركوردهاي زياد كند است دليل اينكه آيدنتيتي نيست نوع فيلدم چون طرف ميخواد اگه بين عدد 2 و 4 ركورد 3 رو حذف كرد بتونه دوباره از اين عدد استفاده كنه برا همين ميخوام توي اين نوع فيلد ببينم چطوري آخرين عدد اين فيلد كه آيدنتيتي نيست رو بدست بيارم
مممممممممنون:تشویق::تشویق:

محمد سلیم آبادی
پنج شنبه 28 مرداد 1389, 11:44 صبح
پیشنهاد من اینه که از همون identity استفاده کنین. و هنگامی که پراکندگی بین رکوردها به دلایل مختلف از جمله حذف سطرهای میانی زیاد شد از تکنیک reuse gap این مقاله کمک بگیرین.
http://www.sqlteam.com/article/efficiently-reuse-gaps-in-an-identity-column

s_mokhtari
پنج شنبه 28 مرداد 1389, 12:18 عصر
پیشنهاد من اینه که از همون identity استفاده کنین. و هنگامی که پراکندگی بین رکوردها به دلایل مختلف از جمله حذف سطرهای میانی زیاد شد از تکنیک reuse gap این مقاله کمک بگیرین.
http://www.sqlteam.com/article/efficiently-reuse-gaps-in-an-identity-column
با سلام:افسرده::افسرده:
ببخشيد ميشه اين تكنيك رو بيشتر توضيح بديد
مممممممممنون

محمد سلیم آبادی
پنج شنبه 28 مرداد 1389, 17:59 عصر
با سلام:افسرده::افسرده:
ببخشيد ميشه اين تكنيك رو بيشتر توضيح بديد
مممممممممنون


من مقاله را کامل نخوندم. ولی راه حل پیشنهادی من:
فرض کنید مقادیر ستون Identity شما بعد از مدتی به این شکل در آمد:

{1, 2, 3, 5, 9, 100, 120, 121, 129, 1000}
خب همانطوری که می بینید فضاهای زیادی این بین خالی باقی مانده اند که میشه ازش استفاده کردم. پس بعد از فشرده شدن این فضاها اعداد زیر حاصل میشن:

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

برای انجام این بروز رسانی این کوئری را اجرا کنید:

UPDATE D
SET D.id = D.new_id
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY id ASC) AS new_id
FROM table_name) AS D;

s_mokhtari
شنبه 30 مرداد 1389, 12:18 عصر
UPDATE D
SET D.id = D.new_id
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY id ASC) AS new_id
FROM table_name) AS D; [/quote[/CODE]]
[/CODE]
با سلام
من يه جدول دارم كه اسمش tbl و دوفيلد ids از نوع int و identity
يه فيلد ديگش name از نوع nvarchar
حالا دستور شما رو كه نوشتم خطا ميده
UPDATE tbl
SET tbl.ids = D.new_id
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY ids ASC) AS new_id FROM tbl) AS D;
اينم خطاش
Msg 8102, Level 16, State 1, Procedure p2, Line 4
Cannot update identity column 'ids'.
ممنون:متفکر::متفکر:

محمد سلیم آبادی
شنبه 30 مرداد 1389, 15:04 عصر
SET IDENTITY_INSERT tbl ON;

UPDATE tbl
SET tbl.ids = D.new_id
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY ids ASC) AS new_id FROM tbl) AS D;
SET IDENTITY_INSERT tbl OFF;

s_mokhtari
یک شنبه 31 مرداد 1389, 11:17 صبح
SET IDENTITY_INSERT tbl ON;

UPDATE tbl
SET tbl.ids = D.new_id
FROM (SELECT *, ROW_NUMBER() OVER(ORDER BY ids ASC) AS new_id FROM tbl) AS D;
SET IDENTITY_INSERT tbl OFF;
با سلام
باز همون خطا رو ميده
ممممنون:اشتباه::اشتباه:

hadmo_ces
یک شنبه 31 مرداد 1389, 13:52 عصر
شما بسته به اینکه نوع فیلد چی باشه می تونید از روشهای مختلفی استفاده کنید.
مثلا اگه فیلد از نوع AutoIncrement باشه می تونید از( Max(Field name استفاده کنید.