【发布时间】:2019-08-30 00:10:03
【问题描述】:
执行以下代码会触发错误:
System.Data.SqlClient.SqlException: '无法将 char 值转换为货币。 char 值的语法不正确。
在我添加用于排序目的的第二个参数之前,一切都很好。 为了清楚起见,代码进行了简化。
query as String = "
SELECT a, b, c
FROM DataTable
WHERE c = @PARAM
ORDER BY
CASE @SORTCOLUMN
WHEN 1 THEN a
WHEN 2 THEN b
WHEN 3 THEN c
END"
Dim param As String = "myprarameter"
Dim sortcolumn as Integer = 1
result = connection.Query(Of MyType)(query, New With {Key .PARAM = param, Key .SORTCOLUMN = sortcolumn})
更新:
经过数小时的测试后,我将其范围缩小到纯粹的 SQL 问题,而不是 Dapper 或 .NET Framework。
这是我的发现:
一切正常,直到CASE WHEN 中使用的所有列都属于相同类型(或类型甚至可以轻松相互转换的值)。一旦列类型不同,值无法转换,则返回类型转换错误。似乎它正在尝试将CASE WHEN 选择的列的类型转换为第一个WHENcolumn 的类型。
这里举两个例子。为简单起见,我删除了变量。
这行得通:
CREATE TABLE #TestTable1
(col1 money, col2 money)
INSERT INTO #TestTable1
(col1, col2)
VALUES
(1, 30),
(2, 20),
(3, 10)
SELECT col1, col2
FROM #TestTable1
ORDER BY
CASE 2
WHEN 1 THEN col1
WHEN 2 THEN col2
END
DROP TABLE #TestTable1
但这不起作用。返回:
无法将 char 值转换为货币。 char 值的语法不正确。
CREATE TABLE #TestTable2
(col1 money, col2 varchar(20))
INSERT INTO #TestTable2
(col1, col2)
VALUES
(1, 'cc'),
(2, 'bb'),
(3, 'aa')
SELECT col1, col2
FROM #TestTable2
ORDER BY
CASE 2
WHEN 1 THEN col1
WHEN 2 THEN col2
END
DROP TABLE #TestTable2
我正在使用兼容级别为 150 的 Azure SQL。 我已经相应地更新了标题和标签。
更新 2:
我试图以第二个参数的形式向@forpas 解决方案添加一个复杂性,它将告诉订单。我在CASE 中使用了CASE,但这会返回一些语法错误。
仅限 ORDER 部分。其余的没有改变。
ORDER BY
CASE @SORTORDER
WHEN 'a' THEN
(CASE @SORTCOLUMN
WHEN 1 THEN col1
WHEN 2 THEN col2
END,
CASE @SORTCOLUMN
WHEN 3 THEN col3
WHEN 4 THEN col4
END) ASC
WHEN 'd' THEN
(CASE @SORTCOLUMN
WHEN 1 THEN col1
WHEN 2 THEN col2
END,
CASE @SORTCOLUMN
WHEN 3 THEN col3
WHEN 4 THEN col4
END) DESC
END
【问题讨论】:
标签: sql sql-server vb.net tsql