PDA

View Full Version : سوال: یافتن فیلد حذف شده با دستور select



mbasirati
جمعه 19 آذر 1389, 21:28 عصر
سلام
یه جدول دارم با دو فیلد a , b که فیلد a رو identity در نظر گرفتم. 50 تا رکورد رو درج می کنم وبعد یه رکورد از وسط جدول رو حذف می کنم. حالا میخوام با دستور select این رکورد حذف شده رو پیدا کنم. یعنی مثلا اگه رکورد 20 پاک شده خروجی select عدد 20 باشه. ممنون میشم راهنمایی کنید.
البته اینکه میگم رکورد 20 یعنی رکوردی که فیلد a اون 20 بوده و الان پاک شده.
توجه: نمیخوام از کرسر یا تریگر استفاده کنم. فقط با یه select

Rezahak
جمعه 19 آذر 1389, 21:37 عصر
دوست عزیز همون طور که می دونید دستور DELETE در sql رکوردها را به صورت فیزیکی حذف می کند حالا شما می خواهید رکوردی که به طور فیزیکی حذف شده را بدون اینکه قبل از حذف آنرا در جای دیگری نگهداری کنید به شما نشان بدهد ؟ بیشتر توضیح بدهید لطفا!!!

Rezahak
جمعه 19 آذر 1389, 23:35 عصر
اگر با استفاده از Truncate حذف کرده باشید نمیشه کاری کرد چون شماره identity رو درست میکنه.ولی اگر با استفاده از delete حذف شده باشه یک gap بین رکوردها ایجاد میشه که میشه با استفاده از select اونو بدست آورد.
شما توضیح بدید با چه دستوری رکورد مورد نظر رو حذف کردید.
مگه truncate کل رکوردها را حذف نمی کند ؟؟؟ فکر می کنم منظور ایشون حذف بخشی از رکوردها باشه

حمیدرضاصادقیان
شنبه 20 آذر 1389, 06:41 صبح
مگه truncate کل رکوردها را حذف نمی کند ؟؟؟ فکر می کنم منظور ایشون حذف بخشی از رکوردها باشه

اوه درسته.من اشتباه کردم.فکر کردم کل جدول پاک شده.آخه ساعت 2 شب بود جواب نوشتم.:اشتباه:

@mbasirati : از چه نسخه ای استفاده میکنید تا با توجه به اون کوئری مربوطه رو بشه نوشت.

mbasirati
شنبه 20 آذر 1389, 12:31 عصر
با تشکر از شما دوستان عزیز
آقای صادقیان منظور منو خوب متوجه شدن ، من اون گپی که ایجاد شده رو میخوام پیدا کنم.
من از sql server 2005 standard editionاستفاده می کنم.

حمیدرضاصادقیان
شنبه 20 آذر 1389, 13:57 عصر
دوست عزیز این مقاله (http://barnamenevis.org/showthread.php?66951-%D9%85%D9%82%D8%A7%D9%84%D9%87-(%D8%A7%DB%8C%D9%86%D8%A8%D8%A7%D8%B1-%D9%81%D8%A7%D8%B1%D8%B3%DB%8C!)-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AF%D8%B1-Range-%D9%85%D9%88%D8%B1%D8%AF-%D9%86%D8%B8%D8%B1-%D8%A8%D8%A7-%D8%AD%D8%AF%D8%A7%DA%A9%D8%AB%D8%B1-%D8%B3%D8%B1%D8%B9%D8%AA!&highlight=) کارتون رو راه میندازه.

موفق باشید

علیرضا مداح
شنبه 20 آذر 1389, 14:24 عصر
سلام،
اگر از SQL Server 2005 و به بعد استفاده می کنید، می توانید از عبارت OUTPUT (http://msdn.microsoft.com/en-us/library/ms177564.aspx) جهت دسترسی به رکوردهای حذف شده بهره بگیرید،
به طور مثال:


DELETE FROM <TableName>
OUTPUT deleted.<IdentityFieldName>
WHERE <SomeCondition>

Placeholder ها را با مقادیر دلخواه جایگزین نمایید،/

mbasirati
شنبه 20 آذر 1389, 21:35 عصر
سلام،
اگر از SQL Server 2005 و به بعد استفاده می کنید، می توانید از عبارت OUTPUT (http://msdn.microsoft.com/en-us/library/ms177564.aspx) جهت دسترسی به رکوردهای حذف شده بهره بگیرید،
به طور مثال:


DELETE FROM <TableName>
OUTPUT deleted.<IdentityFieldName>
WHERE <SomeCondition>

Placeholder ها را با مقادیر دلخواه جایگزین نمایید،/

از جواب شما ممنونم ولی همون طور که در بالا ذکر کردم میخوام از دستور select استفاده کنم و فقط با جدول موجود ، بدون استفاده از جدول deleted

Topcoding
یک شنبه 21 آذر 1389, 01:44 صبح
سلام دوست عزیز
امیدوارم این کدها به دردت بخورد



SET IDENTITY_INSERT selid ON
DECLARE @minidentval INT
DECLARE @maxidentval INT
DECLARE @nextidentval INT
SELECT @minidentval = MIN(a), @maxidentval = MAX(a)
FROM selid
IF @minidentval = IDENT_SEED('selid')
SELECT @nextidentval = MIN(a) + IDENT_INCR('selid')
FROM selid t1
WHERE a BETWEEN IDENT_SEED('selid') AND
@maxidentval AND
NOT EXISTS (SELECT * FROM selid t2
WHERE t2.a = t1.a +
IDENT_INCR('selid'))
ELSE
SELECT @nextidentval = IDENT_SEED('selid')
SET IDENTITY_INSERT selid OFF
PRINT @nextidentval


توضیح: selid نام جدولم هست و فیلد a همان که خودتان گفتید می باشد
موفق باشید

حمیدرضاصادقیان
یک شنبه 21 آذر 1389, 07:35 صبح
سلام دوست عزیز
امیدوارم این کدها به دردت بخورد



SET IDENTITY_INSERT selid ON
DECLARE @minidentval INT
DECLARE @maxidentval INT
DECLARE @nextidentval INT
SELECT @minidentval = MIN(a), @maxidentval = MAX(a)
FROM selid
IF @minidentval = IDENT_SEED('selid')
SELECT @nextidentval = MIN(a) + IDENT_INCR('selid')
FROM selid t1
WHERE a BETWEEN IDENT_SEED('selid') AND
@maxidentval AND
NOT EXISTS (SELECT * FROM selid t2
WHERE t2.a = t1.a +
IDENT_INCR('selid'))
ELSE
SELECT @nextidentval = IDENT_SEED('selid')
SET IDENTITY_INSERT selid OFF
PRINT @nextidentval


توضیح: selid نام جدولم هست و فیلد a همان که خودتان گفتید می باشد
موفق باشید



این روش سربار زیادی داره. بهترین راه همون موری هست که در پست 6 بهش اشاره کردم.

mbasirati
سه شنبه 23 آذر 1389, 23:33 عصر
بازم سلام
من هنوز جوابمو نگرفتم ، بازم به دوستان تاکید میکنم که جوابی که من میخوام فقط و فقط از یه دستور سلکت استفاده میکنه ، بدون تعریف هیچ متغیری ، فقط درون یه سلکت ، البته از join میشه استفاده کرد.
من خودم یه جواب پیدا کردم ولی بازم همون طور که میبینید از دوتا سلکت استفاده شده.

SELECT s1.a-1 a FROM x1 s1
INNER JOIN x1 s2 ON s1.a=s2.a+2
EXCEPT
SELECT a FROM x1

بازم برای یادآوری: یه جدول به نام x1 دارم با دوفیلد a ,b که میخوام گپ ایجاد شده رو پیدا کنم.
ممنون