我有以下存儲過程可以在TemplateName,CreatedOn和UploadedBy上升序和降序排序。以下SP運行時不會對記錄進行排序。如果我通過列名替換2,3,4,我得到一條錯誤消息「將nvarchar值'Test Template'轉換爲數據類型int時轉換失敗。」。請建議如何實現排序。動態順序通過不使用動態SQL?
CREATE PROCEDURE [dbo].[usp_SEL_GetRenderingTemplate]
(
@facilityID INT,
@sortOrder VARCHAR(5),
@sortExpression VARCHAR(100),
@errorCode INT OUTPUT
)
AS
BEGIN
SET NOCOUNT ON ;
BEGIN TRY
SET @sortOrder = CASE @sortOrder
WHEN 'Ascending' THEN 'ASC'
WHEN 'Descending' THEN 'DESC'
ELSE 'ASC'
END
SELECT TemplateID,
TemplateName,
CreatedOn,
([user].LastName + ' ' + [user].FirstName) AS UploadedBy
FROM Templates
INNER JOIN [user] ON [user].UserID = Templates.CreatedBy
WHERE facilityid = @facilityID
ORDER BY CASE WHEN @sortExpression = 'TemplateName'
AND @sortOrder = 'ASC' THEN 2
WHEN @sortExpression = 'CreatedOn'
AND @sortOrder = 'ASC' THEN 3
WHEN @sortExpression = 'UploadedBy'
AND @sortOrder = 'ASC' THEN 4
END ASC,
CASE WHEN @sortExpression = 'TemplateName'
AND @sortOrder = 'DESC' THEN 2
WHEN @sortExpression = 'CreatedOn'
AND @sortOrder = 'DESC' THEN 3
WHEN @sortExpression = 'UploadedBy'
AND @sortOrder = 'DESC' THEN 4
END DESC
SET @errorCode = 0
END TRY
BEGIN CATCH
SET @errorCode = -1
DECLARE @errorMsg AS VARCHAR(MAX)
DECLARE @utcDate AS DATETIME
SET @errorMsg = CAST(ERROR_MESSAGE() AS VARCHAR(MAX))
SET @utcDate = CAST(GETUTCDATE() AS DATETIME)
EXEC usp_INS_LogException 'usp_SEL_GetFacilityWorkTypeList',
@errorMsg, @utcDate
END CATCH
END
Russ C - 這看起來不是一個非常有效的技術。 – ScottE 2010-06-15 12:17:07
通過查詢分析器運行它,它高效且易於調試。 它也回答了你在下面提供的相同細節,並且我沒有將日期作爲整數。 – 2010-06-15 13:22:57
與內聯排序情況相比,創建臨時表並有條件地返回其中的某些部分是有效的嗎?我對此表示懷疑。我懷疑編譯器甚至可以得到一個好的查詢計劃。 – ScottE 2010-06-15 14:46:00