使用CAST或CONVERT时SQL Server错误“转换失败”

时间:2015-12-02 11:29:39

标签: sql sql-server sql-server-2008

我是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,“转换varchar时转换失败   价值'PRISGAR。'

我无法弄清楚这一点。我还不知道PRISGAR是什么。我也试过了CONVERT,得到了同样的错误。字段[Item No_]varchar(20),我尝试将其转换为INT并检查两个数字。

4 个答案:

答案 0 :(得分: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]')

答案 1 :(得分:0)

试试这个:

 <style
    name="BaseTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>
    <item name="homeAsUpIndicator">@drawable/menu</item>
    <item name="android:textColorPrimary">@android:color/white</item>
</style>

答案 2 :(得分:0)

列jl。[Item No_]包含字符串。检查所有行并从该列中删除字符串,然后使用上面的查询。

答案 3 :(得分:0)

您应该使用案例表达式(对于某些特殊字符串可能会出错,例如&#39;。&#39;,您可以添加一些额外的检查):

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