2015-12-02 297 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