此SQL語句在ORDER BY'+ @SortField +''+ @SortOrder +'部分中被標記在SQL Server中。任何想法如何解決?SQL Server中變量的分頁排序
ALTER PROC [sbuser].[sp_MemberMailList ]
@MemberMailID bigint = null,
@FromMemberID bigint = null,
@ToMemberID bigint = null,
@Subject varchar(150) = null,
@Message varchar(8000) = null,
@FromDeletedFlag bit = null,
@ToDeletedFlag bit = null,
@FromArchivedFlag bit = null,
@ToArchivedFlag bit = null,
@ReadFlag bit = null,
@SQL nvarchar(4000) = null,
@SortField varchar(100) = null,
@SortOrder varchar(25) = null,
@NotificationSent bit = null,
@MemberID bigint = null,
@OnHold bit = 0,
@SpecialMail varchar(1) = 'N',
@PageSize float = null,
@PageNum int = 1,
@TotalPages float = null,
@StartDate datetime = null,
@EndDate datetime = null,
@MODE varchar(50)
AS
IF @MODE = 'INBOX-MAIL'
BEGIN
SELECT @TotalPages = COUNT(*)/@PageSize
FROM MemberMail a
INNER JOIN Member b ON b.MemberID = a.FromMemberID
WHERE a.ToMemberID = @ToMemberID
AND a.ToDeletedFlag = 0
AND a.OnHold = 0
AND a.ToArchivedFlag = 0;
WITH InMails AS
(
SELECT ROW_NUMBER() OVER(ORDER BY ' + @SortField + ' ' + @SortOrder + ') AS RowNum,
a.MemberMailID,
a.FromMemberID,
a.Subject,
a.CreateDate,
b.UserName,
a.ToReadFlag,
b.Firstname,
b.Lastname,
b.MemberDisplayName AS DisplayName
FROM MemberMail a
INNER JOIN Member b ON b.MemberID = a.FromMemberID
WHERE a.ToMemberID = @ToMemberID
AND a.ToDeletedFlag = 0
AND a.OnHold = 0
AND a.ToArchivedFlag = 0
)
SELECT *
FROM InMails
WHERE RowNum BETWEEN (@PageNum - 1) * @PageSize + 1 AND @PageNum * @PageSize
ORDER BY CreateDate DESC
END
任何幫助,將不勝感激..
非常感謝
任何想法如何解決這個問題?請真的在這裏使用幫助。 – neojakey
@neojakey - 前兩個選項中的任何一個都可以工作。基本上你在'order by'中有靜態字段,或者整個語句必須是一個動態字符串。這是因爲你選擇'order by'可以完全改變查詢計劃及其優化方式,所以在緩存SQL時沒有任何價值。 – Keith
@neojakey - 有一種方法可以解決這個問題,但它很討厭。你的sproc只能有你的'MemberMail'或'Member'表中的排序字段,所以你可以爲每個可排序字段重複整個語句。這將是非常難看的代碼,但會給出它可以緩存的SQL查詢計劃。 – Keith