2015-12-02 298 views
2

我在sql server中很新。我试图运行此以下查询:使用CAST或CONVERT时SQL Server错误“转换失败”

SELECT AVG(jl.[Stock Weight]) 
    FROM [Settlement Line] jl 
    WHERE jl.[Vendor No_] = 8516 
    AND (jl.[Slaughter Date] BETWEEN '2015-11-01' AND '2015-11-30') 
    AND (CAST(jl.[Item No_] AS INT) BETWEEN 17000 AND 17099) 

其结果是,我得到这个错误:

OperationalError: (245, "Conversion failed when converting the varchar value 'PRISGAR.'

我不知道这一点。我也不知道PRISGAR是什么。我也试过用CONVERT也得到同样的错误。该字段[Item No_]varchar(20),我试图将其转换为INT并在两个数字之间进行检查。

+1

你能提供你的表的模式,所以我们可以看到什么请输入字段?这只是一个类型错误。 – Dane

+3

一行'PRISGAR'作为'[Item No_]'字段中的值。这不能转换为'INT' – Raj

+1

备注:[你不想在SQL Server上使用'BETWEEN'作为日期/时间类型](http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx)(或者其他地方的很多地方)。 –

回答

2

距离误差不明的错误是否是[Vendor No_][Item No_]jl.[Stock Weight]。 SQL是强类型的,但类型转换。您应该尝试使用相同类型进行比较,而不要将数字存储为字符串。

如果问题是平均值,那么您可以使用case。喜欢的东西:

SELECT AVG(CASE WHEN ISNUMERIC(jl.[Stock Weight]) = 1 
       THEN CAST(jl.[Stock Weight] as FLOAT) 
      END) 

对于比较逻辑,这表明使用相同类型的作为恒定的柱:

j1.[Vendor No_] = '8516' 

[Item No_]是更麻烦的一点。人们很容易写:

jl.[Item No_] BETWEEN '17000' AND '17099' 

然而,这会匹配“170019991234545”,因为比较会为字符串,而不是数字来完成。另一种方法是:

(jl.[Item No_] BETWEEN '17000' AND '17099' AND LEN(jl.[Item No_]) = 5) 

但是,这会匹配'1702A'。另一个可以使用LIKE以确保值是所有数字:

(jl.[Item No_] BETWEEN '17000' AND '17099' AND 
jl.[Item No_] LIKE '[0-9][0-9][0-9][0-9][0-9]' 
) 

这可以简化为:

(jl.[Item No_] LIKE '170[0-9][0-9]') 
+0

有助于我尝试实现的目标。谢谢。 –

0

试试这个:

SELECT AVG(jl.[Stock Weight]) 
FROM dbo.[Settlement Line] jl 
WHERE jl.[Vendor No_] = 8516 
    AND jl.[Slaughter Date] BETWEEN '20151101' AND '20151130' 
    AND jl.[Item No_] BETWEEN '17000' AND '17099' 
0

列JL [项目NO_]包含字符串作为地方。检查所有行并从该列中删除字符串,然后使用上面的查询。

0

您应该使用CASE表达式(这可能犯错对于一些特殊的字符串,比如,你可以添加一些额外的检查,“”):

case 
    when isnumeric(jl.[Item No_]) = 1 
    then CAST(jl.[Item No_] AS INT) 
    else 0 
end BETWEEN 17000 AND 17099