سلام یه سوال داشتم در مورد استخراج اطلاعات از Sql

سلام دوستان

من چه طوری می تونم با اس کیو ال رکوردهای خاصی رو استخراج کنم مثلا از شماره 10 تا 20 و با دستور top نتونستم اینجوری در بیارم .
 

mehradmoein

Member
با سلام,
می تونید از این کد استفاده کنید:
select * from table where id >10 and id < 20
 
دستور دیگری مثل TOP وجود نداره که این کار رو بکنه . مثلا اگه Table ای دی یا هر فیلد منحصر به فردی نداشت چی کار کنم
 

mehradmoein

Member
در اون مورد اطلاعی ندارم ولی کلا این که یک table یک id نداشته باشه,درست نیست.
گذاشتن id برای همین کارها هست.
 

amir_m

Member
با سلام.
همونطور که آقای معين گفتند بسيار بهتره که Table شما دارای يک Primary Key باشد. اما در هر صورت می تونيد هرچند تا رکورد که می خوايد رو انتخاب کنيد. با Stored Prcedure زير:


کد:
declare @StartRec int
declare @EndRec int
declare @RecCount int
declare @Cmd varchar(5000)

Set @StartRec = 10
Set @EndRec = 17
Select @RecCount=Count(*) FROM YourTable


Set @Cmd = 'SELECT * FROM  YourTable ' +
	' WHERE TableID Not IN(SELECT Top ' + convert(varchar,@StartRec) + ' TableID FROM YourTable) ' +
	' AND TableID Not IN(SELECT Top ' + convert(varchar,(@RecCount - @EndRec)) + ' TableID FROM YourTable ORDER BY TableID DESC)'

Exec (@Cmd)

در اين کد شما نيازی نداريد که ID جدولتون کاملا پشت سر هم باشه.
 
سوالی در مورد اختصاص دادن شماره به Repeater

می خواستم ببینم چه جوری میشه برای Repeater یا GridView یه شماره ردیف در نظر گرفت که بدون اینکه به بانک ربط داشته باشد خودش از شماره 1 تا n را به نتیجه پرسو جو اختصاص بده .
 

amozesh

Member
با سلام
یک سوال در همین رابطه من داشتم
خوب این مواردی که شما گفتید در صورتی که بخوایم اطلاعات همین جوری از Table بیرون بکشیم
حالا اگه بخوایم بعد ار یک پرسو جو نتیجه 20 تا 40 رو بدست بیاریم چکار می کنیم چون دیگه ID هم نمی تونه کمک کنه این رو هم بگم که تمام Table ها یک Colume برای ID دارن نمونه جستجو اینه:
SELECT P.ProfileName,P.ProfileLName,U.UserAccessGroup,U.UserEmail FROM [User] AS U,[Profile] AS P WHERE P.ProfileSiteID = @UserSiteID AND U.UserSiteID = @UserSiteID
حالا با دستور TOP می شه مثلا 20 تا اول رو بر گردون ولی رکوردهای ما بین اون رو چطور بدست بیارم کاری که توی تمام سرچ ها مثل گوگل و ... انجام میشه
لطفا زود جواب بدید
ممنون
 

karwan

Member
سلام .
فكر نكنم كد هايي كه اينجا گفتن براي هر حالتي درست باشه . چون ممكن بخواهيد از db پاك كنيد و id ها تغييري نميكنن و مشكل پيش مياد . شما مي تونيد از تنظيمات repeater يا datagrid يا ... استفاده كنيد . مشخص مي كنه كه datagrid جند سطر داشته باشه . ولي بايد paging رو فعال كنيد تا خودش صفحه بندي بكنه . كار سختي نيست .
تو گوگل يه search براي datagrid paging بزني حل .
 

amir_m

Member
با سلام.

شما اگر از تنظيمات Datagrid برای Paging استفاده کنيد، تا حدود 80% از Performance سايتتون کاسته خواهد شد.

دليلش هم کاملا مشخصه، به عنوان مثال شما اگر در جدولتون 5000 رکورد داشته باشيد و مثلا در صفحه 5 از جدول بخواهيد 30تای اونها رو نشون بديد، Datagrid تمام 5000 رکورد رو صدا می کنه و 30تای مورد نظر رو نشون میده که اينکار باعث پايين اومدن کارايی سايتتون میشه.

شما بسيار راحت می تونيد يک Table مجازی با يک کليد که به صورت Identity مقدار دهی ميشه در StoredProcedureتون ايجاد کنيد، ديتای مورد نظر رو به صورت دلخواه Sort کنيد، داخل Table بريزيد و بعد، از شماره مثلا 50 تا 80 ID جدول مجازيتون رو برگردونيد. اينتوری نه به SQL فشار مياد و نه به سرور.

اگر لازمه بگيد کد کامل سيستم Paging رو براتون بذارم.
 

amozesh

Member
با سلام
جوابتون عالی بود این دقیقا چیزی که من می خوام
فقط یک موردی اگر SQL بخواد این تعداد نتیجه رو به یک Table مجازی انتقال بده بعد دوباره تعداد بخصوصی رو بخونیم مثل Datagrid به SQL فشار نمی آید چون اینم دقیقا همون حالت.
اگه فشاری رو سرور متحمل نمی شه ممنون می شم کدی که برای ساخت Table مجازی یا اینکه کد SELECT بالا رو تکمیل کنید.
بعد دستوری مثل دستور TOP وجود نداره که تعداد مابین رو بدون اینکه به سرور فشار وارد بشه من که خودم هر چی گشتم چیزی پیدا نکردم.
شاید بشه با ترکیبی از دستور TOP و یکی دوتای دیگه هم این کارو کرد.
ممنون از جواب هاتون
 

amir_m

Member
با سلام.

چون اطلاعات در خود SQL در جدول مجازی ريخته میشه و فيلتر ميشه، خيلی باری روی سرور ايجاد نمی کنه. SQL هم که برای تحمل همين فشارها ساخته شده. پس هيچ مشکلی در Performance سايتتون پيش نمياد.
حتی SQL توصيه میکنه تمام عمليات رياضيتون رو هم در خود SQL انجام بديد و فقط نتيجه رو برگردونيد.

اين يک Stored Procedure هست که سطرهای مورد نظر رو از جداول مورد نظر استخراج می کنه.

کد:
CREATE PROCEDURE Paging_SubQuery (
@Tables varchar(1000),
@PK varchar(100),
@Sort varchar(200) = NULL,
@PageNumber int = 1,
@PageSize int = 10,
@Fields varchar(1000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL)
AS

DECLARE @strPageSize varchar(50)
DECLARE @strSkippedRows varchar(50)
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)

/*Default Sorting*/
IF @Sort IS NULL OR @Sort = ''
	SET @Sort = @PK
SET @Sort = ' ORDER BY ' + @Sort + ' '

/*Default Page Number*/
IF @PageNumber < 1
	SET @PageNumber = 1

/*Set paging variables.*/
SET @strPageSize = CONVERT(varchar(50), @PageSize)
SET @strSkippedRows = CONVERT(varchar(50), @PageSize * (@PageNumber - 1))

/*Set filter & group variables.*/
IF @Filter IS NOT NULL AND @Filter != ''
	BEGIN
		SET @strFilter = ' WHERE ' + @Filter + ' '
		SET @strSimpleFilter = ' AND ' + @Filter + ' '
	END
ELSE
	BEGIN
		SET @strSimpleFilter = ''
		SET @strFilter = ''
	END
IF @Group IS NOT NULL AND @Group != ''
	SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
	SET @strGroup = ''


IF @PageNumber = 1  -- In this case we can execute a more efficient query with no subqueries.
	EXEC (
		'SELECT TOP ' + @strPageSize + ' ' + @Fields + ' FROM ' + @Tables +
			@strFilter + @strGroup + @Sort
)
ELSE  -- Execute a structure of subqueries that brings the correct page.
	EXEC (
		'SELECT ' + @Fields + ' FROM ' + @Tables + '  WHERE ' + @PK + ' IN ' + '
			(SELECT TOP ' + @strPageSize + ' ' + @PK + ' FROM ' + @Tables +
			' WHERE ' + @PK + ' NOT IN
				(SELECT TOP ' + @strSkippedRows + ' ' + @PK + ' FROM ' + @Tables +
					@strFilter + @strGroup + @Sort + ') ' +
			@strSimpleFilter +
			@strGroup +
			@Sort + ') ' +
			@strGroup +
			@Sort
)
GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO



اين رو هم از سايت مايکروسافت برداشتم.

کد:
CREATE PROCEDURE northwind_OrdersPaged
(
    @PageIndex int, 
    @PageSize int
)
AS
BEGIN
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
DECLARE @RowsToReturn int

-- First set the rowcount
SET @RowsToReturn = @PageSize * (@PageIndex + 1)
SET ROWCOUNT @RowsToReturn

-- Set the page bounds
SET @PageLowerBound = @PageSize * @PageIndex
SET @PageUpperBound = @PageLowerBound + @PageSize + 1

-- Create a temp table to store the select results
CREATE TABLE #PageIndex 
(
    IndexId int IDENTITY (1, 1) NOT NULL,
    OrderID int
)

-- Insert into the temp table
INSERT INTO #PageIndex (OrderID)
SELECT 
    OrderID
FROM 
    Orders
ORDER BY 
    OrderID DESC

-- Return total count
SELECT COUNT(OrderID) FROM Orders

-- Return paged results
SELECT 
    O.*
FROM 
    Orders O,
    #PageIndex PageIndex
WHERE 
    O.OrderID = PageIndex.OrderID AND
    PageIndex.IndexID > @PageLowerBound AND
    PageIndex.IndexID < @PageUpperBound
ORDER BY 
    PageIndex.IndexID

END
اميدوارم کمکتون کنه.
 
آخرین ویرایش:

amozesh

Member
با سلام
و تشکر فراوان بابت جواب کامل و خوبتان دقیقا همون موردی بود که دنبالش بودم.
امیدوارم بتوانم در موارد دیگر جبران کنم.
موفق باشید
 

جدیدترین ارسال ها

بالا