【发布时间】:2011-03-03 22:56:15
【问题描述】:
我有以下存储过程,可以对 TemplateName、CreatedOn 和 UploadedBy 进行升序和降序排序。以下 SP 运行时不会对记录进行排序。如果我将 2、3、4 替换为列名,则会收到错误消息“将 nvarchar 值 'Test Template' 转换为数据类型 int 时转换失败。”。请建议如何实现排序.
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
【问题讨论】:
标签: sql sql-server-2005 dynamic-sql