jla*_*t96 1 sql t-sql sql-server
我正在尝试创建一个存储过程,允许调用者指定他们是否要按列排序。该参数应该是可选的。我正在使用 SQL Server Express
@sortBy VARHCAR(255) = ''
BEGIN
SELECT * FROM Document
ORDER BY
CASE @sortBy
WHEN 'documentId' THEN documentId
WHEN 'documentName' THEN documentName
WHEN 'dateCreated' THEN dateCreated
WHEN 'dateLastAccessed' THEN dateLastAccessed
ELSE documentName
END;
END
Run Code Online (Sandbox Code Playgroud)
我可以创建该过程,但是当我执行它时,我收到以下消息
Conversion failed when converting date and/or time from character string.
Run Code Online (Sandbox Code Playgroud)
dateCreated 和 dateLastAccessed 是 DATE 类型,但我不知道它们是否是罪魁祸首。我是否不小心告诉数据库使用此过程转换日期/时间?这是我第一次使用存储过程的可选参数,所以我可能做得不对。任何帮助表示赞赏
谢谢
正如 Tim 和 Sean 在评论中所写,case 表达式只能返回一种数据类型。
当每个选项包含不同的数据类型时,SQL Server 会尝试将所有数据类型隐式转换为更高优先级的数据类型(请参阅此处的列表)。
您可以通过使用稍微麻烦一点的查询来克服这个问题:
SELECT *
FROM Document
ORDER BY
CASE WHEN @sortBy = 'documentId' THEN documentId END,
CASE WHEN @sortBy = 'documentName' THEN documentName END,
CASE WHEN @sortBy = 'dateCreated' THEN dateCreated END,
CASE WHEN @sortBy = 'dateLastAccessed' THEN dateLastAccessed END;
Run Code Online (Sandbox Code Playgroud)
请注意,如果不指定else
部分,case
表达式将返回null
- 因此不应影响记录的整体顺序。
归档时间: |
|
查看次数: |
884 次 |
最近记录: |