在我的GridView中,我在创建自定义分页控件时关闭了分页。我有一个SQL存储过程,我传入页码作为参数返回。我现在遇到的问题是排序不再适用于返回的当前记录1000.当我打开排序时,当前的1000条记录集被排序,而不是整个记录集。我很确定这是因为我的存储过程也只返回了1000条记录。我能想到完成我要做的事情的唯一方法是将所有列名作为case语句传递,并根据它们作为附加参数进行排序。必须有比这更好的方法。有什么想法吗?
这是我目前正在做的事情,没有排序就可以正常工作。 @StartRow和@EndRow总是基于传递的页码,其中@StartRow等于页码* 1000(每页返回1000行)。
@StartRow INT,
@EndRow INT
AS
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY EmployeeID) AS Row,
HR.EmployeeID, HR.FirstName, HR.LastName,
ISNULL(Locations.City,'') + ', ' + ISNULL(Locations.State,'') as LocationName
FROM HR
INNER JOIN Locations ON HR.LocationID = Locations.LocationID
) AS X
GROUP BY X.Row, X.EmployeeID, X.FirstName, X.LastName
HAVING X.Row BETWEEN @StartRow AND @EndRow
ORDER BY X.Row
这是我在使用自定义分页控件时完成排序的唯一方法。虽然我认为有一种更好的方式,但不会浮现在脑海中。
@StartRow INT,
@EndRow INT,
@Sort nvarchar(25)
AS
CREATE TABLE #Temp1
(
EmployeeID nvarchar(25),
FirstName nvarchar(25),
LastName nvarchar(25),
LocationName nvarchar(25)
)
INSERT INTO #Temp1
SELECT * FROM
(
SELECT
HR.EmployeeID, HR.FirstName, HR.LastName,
ISNULL(Locations.City,'') + ', ' + ISNULL(Locations.State,'') as LocationName
FROM HR
INNER JOIN Locations ON HR.LocationID = Locations.LocationID
) AS X
GROUP BY X.EmployeeID, X.FirstName, X.LastName, X.LocationName
SELECT * FROM
(
SELECT ROW_NUMBER() OVER (ORDER BY
CASE
WHEN @Sort = 'EmployeeID' THEN #Temp1.EmployeeID
WHEN @Sort = 'FirstName' THEN #Temp1.FirstName
WHEN @Sort = 'LastName' THEN #Temp1.LastName
WHEN @Sort = 'LocationName' THEN #Temp1.LocationName
ELSE #Temp1.EmployeeID
END
) AS Row, *
FROM #Temp1
) AS X
WHERE X.Row BETWEEN @StartRow AND @EndRow
drop table #Temp1
答案 0 :(得分:0)
您可以构建一个包含sql语句的字符串,然后执行该字符串...
SET @SqlString = N'SELECT... ORDER BY ' + @Sort
EXECUTE sp_executesql @SQLString
你需要真正约束@Sort字符串,这样你就不会受到sql注入的攻击,但是如果确保字符串被清理了,那么这应该没问题。
另外,出于同样的原因(为了防止sql注入),你需要将startrow和endrow视为参数,或者再次对它们进行清理,然后将它们作为文字插入到SqlString中。