我有这个在这个nvarchar上失败的SQL查询,即使在我看来,它已被适当保护以使转换工作。我试图获取我只有读取权限的数据库上正确格式化数值的平均值。
select TagName, count(TagName) as Freq,
sum(isnumeric(value)) as GoodNums,
avg(case isnumeric(value) when 1 then cast(value as numeric) else 0 end) as "Avg",
Min(Timestamp) as StartTime,
Max(Timestamp) as EndTime
from HH_Data_9 group by TagName
但是我从来没有真正完成CASE,聚合函数和GROUP_BY组合的SQL语法,所以也许我只是写错了(在发布之前尝试过很多东西)。注意" GoodNums"专栏工作并给出了合理的答案但是当我添加" Avg"用于查询整个事物错误的列:
Msg 8114, Level 16, State 5, Line 1
Error converting data type nvarchar to numeric.
顺便说一下,这是Microsoft SQL Server 2014。有什么想法吗?
答案 0 :(得分:1)
只是想提醒一下,这种做法非常危险。请考虑以下表结构:
CREATE TABLE TestTable
(
FieldType NVARCHAR(50) ,
FieldValue NVARCHAR(50)
)
GO
INSERT INTO dbo.TestTable
VALUES ( 'INT', '5' ),
( 'INT', '15' ),
( 'MONEY', '5.5' )
SELECT *
FROM dbo.TestTable
WHERE FieldType = 'INT'
AND CAST(FieldValue AS INT) > 10
在我的机器上,这个查询有效,但这里的事情是许多人认为这个谓词将从左到右进行评估。但这是不正确的。 SQL Server引擎可能决定从右到左评估此表达式。在这种情况下,您将收到Conversion failed
错误。它被称为ALL-AT-ONCE
原则。但是在您的示例中,这不适用,但只是想提及。