PDA

View Full Version : سوال: بدست آوردن آخرین رکورد



طبیب دل
شنبه 20 آبان 1391, 10:11 صبح
با سلام به دوستان
ببخشید
میدونم جای این سئوال اینجا نیست ولی خیلی عجله دارم آخه تو بخش sql کسی سر نمیزنه
من یک جدول در بانکم دارم که دو فیلد داره یکی از نوع int و دیگری nvarchar . حالا چطوری آخرین سطر اضافه شده به این جدول رو بدست بیارم. در واقع آخرین مقدار فیلد nvarchar رو میخوام
با تشکر

حسین شهریاری
شنبه 20 آبان 1391, 10:53 صبح
سلام
با استفاده از تابع MAX میتونی بزرگترین مقدار را بدست بیاری.

میلاد رئیسی
شنبه 20 آبان 1391, 10:54 صبح
سلام . دوست عزیز با یه جست جوی ساده میتونی به راحتی به جواب برسی ! http://barnamenevis.org/showthread.php?252458-%D8%A2%D8%AE%D8%B1%DB%8C%D9%86-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF&highlight=%D8%A8%D8%AF%D8%B3%D8%AA+%D8%A2%D9%88%D8 %B1%D8%AF%D9%86+%D8%A2%D8%AE%D8%B1%DB%8C%D9%86+%D8 %B1%DA%A9%D9%88%D8%B1%D8%AF و http://barnamenevis.org/showthread.php?342478-%D8%A8%D8%A7%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%D8%A2%D8%AE%D8%B1%DB%8C%D9%86-%D8%B1%DA%A9%D9%88%D8%B1%D8%AF&highlight=%D8%A2%D8%AE%D8%B1%DB%8C%D9%86+%D8%B1%DA %A9%D9%88%D8%B1%D8%AF+linq

AmirGhasemi
شنبه 20 آبان 1391, 11:15 صبح
سلام
جناب شهرياري مقدار ماكزيمم خيلي وقتها نتيجه اشتباه مي ده! ممكنه كه آيدي ما مثلا GUID‌باشه اونووقت ديگه ماكزيمم اصلا جواب نمي ده

بهترين روش اينه كه از دستور زير استفاده كني!

CREATE PROCEDURE [dbo].[Management_UserRoles_Insert]
(
@ID bigint OUTPUT,
@UserName nvarchar (30),
@RoleID int
)
AS
INSERT INTO Management_UserRoles
([UserName], [RoleID])
VALUES
(@UserName, @RoleID)
SET @ID= @@IDENTITY

طبیب دل
شنبه 20 آبان 1391, 11:17 صبح
سلام
با استفاده از تابع MAX میتونی بزرگترین مقدار را بدست بیاری.

ببینید من بیشترین مقدار فیلد nvarchar رو میخوام مثلا از 1 تا 10 ذخیره شده ولی تابع max طوریه که عدد 9 رو به عنوان بزرگتر برمی گردونه ولی من 10 رو میخوام که آخرین بار ذخیره شده

طبیب دل
شنبه 20 آبان 1391, 11:21 صبح
سلام
جناب شهرياري مقدار ماكزيمم خيلي وقتها نتيجه اشتباه مي ده! ممكنه كه آيدي ما مثلا GUID‌باشه اونووقت ديگه ماكزيمم اصلا جواب نمي ده

بهترين روش اينه كه از دستور زير استفاده كني!

CREATE PROCEDURE [dbo].[Management_UserRoles_Insert]
(
@ID bigint OUTPUT,
@UserName nvarchar (30),
@RoleID int
)
AS
INSERT INTO Management_UserRoles
([UserName], [RoleID])
VALUES
(@UserName, @RoleID)
SET @ID= @@IDENTITY



میشه بگید چطوری فراخوانی کنم و چطوری تو برنامه خروجی رو تو تکس باکس نشون بدم

mehdi.mousavi
شنبه 20 آبان 1391, 11:32 صبح
ببینید من بیشترین مقدار فیلد nvarchar رو میخوام مثلا از 1 تا 10 ذخیره شده ولی تابع max طوریه که عدد 9 رو به عنوان بزرگتر برمی گردونه ولی من 10 رو میخوام که آخرین بار ذخیره شده

سلام.
لطفا ابتدا این پست (http://barnamenevis.org/showthread.php?269992-%D8%A8%D8%A7%D8%B2%DB%8C%D8%A7%D8%A8%DB%8C-%D8%A2%D8%AE%D8%B1%DB%8C%D9%86-%D8%AE%D8%A8%D8%B1-%D8%AF%D8%B1%D8%AC-%D8%B4%D8%AF%D9%87-%D8%AF%D8%B1-%D8%AC%D8%AF%D9%88%D9%84&p=1194073&viewfull=1#post1194073) رو مطالعه کنید تا متوجه بشید عبارت "آخرین رکورد" صحیح نیست و چیزی تحت این عنوان وجود نداره.
اینطور که پیداست شما مقادیر عددی در NVARCHAR نگهداری کرده اید. اگر قصد دارید تا بزرگترین عدد درج شده در این Column
رو بدست بیارید و با فرض اینکه کلیه مقادیر ثبت شده در این ستون، لزوما عدد نباشند، می تونید بدین شکل عمل کنید:

SELECT MAX(CAST(MyCol AS BIGINT))
FROM MyTable
WHERE ISNUMERIC(MyCol) = 1

اما و این اما بزرگ هستش! اگر کلیه مقادیر ثبت شده در این ستون عددی هستند، شما هرگز نباید اونو NVARCHAR تعریف کنید.
دستور SQL فوق اگر چه بزرگترین MyCol عددی رو در MyTable بهتون میده، اما باید از لحاظ کارایی و Performance روی داده ها
موجودتون بررسیش کنید...

موفق باشید.

طبیب دل
شنبه 20 آبان 1391, 12:33 عصر
سلام.
اما و این اما بزرگ هستش! اگر کلیه مقادیر ثبت شده در این ستون عددی هستند، شما هرگز نباید اونو NVARCHAR تعریف کنید.
دستور SQL فوق اگر چه بزرگترین MyCol عددی رو در MyTable بهتون میده، اما باید از لحاظ کارایی و Performance روی داده ها
موجودتون بررسیش کنید...

موفق باشید.
خیلی ممنون فعلا کارم راه میندازه ولی ببینید این فیلد قراره شماره حساب باشه و در بعضی موارد ممکنه کاربر شماره حساب 125/الف رو بخواد وارد کنه برای این موارد فیلد رو چطور در نظر بگیرم؟
و سئوال دیگه اینکه مرتب سازی در همون مواردی که تمام رکوردها عدد هستند چه طور انجام بشه که مقدار 10 رو از 9 بزرگتر در نظر بگیره

omidamiry
شنبه 20 آبان 1391, 13:52 عصر
فقط باید ی سلکت معمولی بنویسی و در حلقه به اخرین رکورد بری و مقدارتو برداری. فقط سورت نکن
معمولا به نوبت درج میشه

linux
شنبه 20 آبان 1391, 14:23 عصر
با سلام به دوستان
ببخشید
میدونم جای این سئوال اینجا نیست ولی خیلی عجله دارم آخه تو بخش sql کسی سر نمیزنه
من یک جدول در بانکم دارم که دو فیلد داره یکی از نوع int و دیگری nvarchar . حالا چطوری آخرین سطر اضافه شده به این جدول رو بدست بیارم. در واقع آخرین مقدار فیلد nvarchar رو میخوام
با تشکر
بهترین راه این هست که یک فیلد جدید اضافه کنید از نوع تاریخ و بصورت خودکار با تابع getdate() در زمان درج مقدار بگیرد با این روش هم آخرین رکورد را می توانید بدست بیاورید هم ساعت و زمان ثبت هر رکورد

mehdi.mousavi
شنبه 20 آبان 1391, 19:59 عصر
فقط باید ی سلکت معمولی بنویسی و در حلقه به اخرین رکورد بری و مقدارتو برداری. فقط سورت نکن معمولا به نوبت درج میشه

سلام.
مطلقا اینطور نیست. بعنوان قانونی کلی، وقتی در SELECT Statement ای از ORDER BY استفاده نکنید، نمی تونید به هیچ وجه تضمین کنید که رکوردها بر اساس ترتیب مورد نظر شما به شما برگردونده میشن. SQL Server هنگام اجرای دستور، بر اساس شرایط موجود (تعداد پردازنده ها، تعداد Thread ها، Optimizer و ...) تصمیم میگیره رکورد ها رو بر اساس چه ترتیبی به شما برگردونه. SQL Server همواره سریعترین راه رو برای انتخاب رکورد ها طی میکنه، خواه این عمل منجر به Sort شدن داده ها بر اساس انتظار شما بشه، خواه نشه. لطفا به این مطلب (http://blogs.msdn.com/b/conor_cunningham_msft/archive/2008/08/27/no-seatbelt-expecting-order-without-order-by.aspx) و این مطلب (http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/05/20/without-order-by-there-is-no-default-sort-order.aspx) برای اطلاعات بیشتر مراجعه کنید.

بنابراین، اگر در SELECT ای بصورت صریح عنوان نکنید که داده ها بر چه اساسی مرتب بشه، هرگز نباید به Sort بودن اونها تکیه کنید.

موفق باشید.