我对SQL很新;我正在努力从数据库中提取数据。我试图用Au值>提取所有记录1.00。
AttributeValue列为NVARCHAR
这就是我的尝试:
SELECT TOP 1000 [Id]
,[DHGeochemistryId]
,[AttributeColumn]
,[AttributeValue]
,[ModifiedDate]
,[ModifiedBy]
,[MRTDetailId]
FROM [DRILLHOLES_Export].[dbo].[DHGeochemistryAttr]
WHERE [AttributeValue] > 1.00 and [AttributeColumn] = 'Au'
软件引发以下错误:
Msg 8115,Level 16,State 8,Line 2 将nvarchar转换为数据类型numeric的算术溢出错误。
我尝试使用以下代码转换为数字:
SELECT TOP 1000 [Id]
,[DHGeochemistryId]
,[AttributeColumn]
,[AttributeValue]
,[ModifiedDate]
,[ModifiedBy]
,[MRTDetailId]
FROM [DRILLHOLES_Export].[dbo].[DHGeochemistryAttr]
SET myValue = CASE WHEN ISNUMERIC(AttributeValue)=1 THEN CAST(AttributeValue AS float)
ELSE 0 END)
WHERE [AttributeValue] > 1.00 and [AttributeColumn] = 'Au'
软件引发以下错误:
Msg 102,Level 15,State 1,Line 10 ' ='附近的语法不正确。 (第10行是“SET”命令)
我正在使用SQL Server 2014会感激一点帮助。
答案 0 :(得分:4)
第一个语句抱怨因为AttributeValue
不是数字列。你可以CAST
:
WHERE CAST([AttributeValue] AS FLOAT) > 1.00
但如果其中的任何值不是数字,则可能会出错。所以你可以在演员之前使用ISNUMERIC
:
WHERE ISNUMERIC([AttributeValue]) = 1
AND CAST([AttributeValue] AS FLOAT) > 1.00
SQL Server非常聪明,可以使逻辑短路,因此如果CAST
子句的第一部分返回false,它就不会尝试WHERE
。
答案 1 :(得分:1)
我仍然认为它会出错,但是你可以试一试......赶上你应该没问题。这是一个示例:
create table #test (
attValue nvarchar(100),
attCol nvarchar(100))
insert into #test (attValue, attCol)
select '.99', 'Au'
union
select '1.1', 'Au'
union
select 'hello', 'Au'
union
select '1.01', 'Au'
union
select '1.2', 'Au'
union
select '1.5', 'Au'
begin try
;with atts (AttributeValue, AttributeCol) as
(
select convert(float, x.attValue) as aVal, x.attCol
from (
select attValue, attCol
from #test
where IsNumeric(attValue) = 1
) x
)
select * from atts
where AttributeValue > cast(1.0 as float)
end try
begin catch
-- do nothing
end catch