2016-12-27 69 views
0

我困住了一個表,它有一列,[Renewal]被設置爲nvarchar(255),爲空。不是我的手藝,我不能改變它。我現在需要在計算中使用此列。儘可能接近我在一個聲明中所做的事情,但是我不能在ELSE語句之後通過「錯誤的語法附近...」錯誤。如果遇到試圖將CAST作爲INT的問題,我希望它繼續處理剩餘的記錄,而不是整個查詢。我想我可以添加一個額外的列,即INT,不爲空,並寫一個更新語句在此之前運行,但我擔心我會跑到相同的問題。我比SQL人更像UI人,有什麼建議嗎?它將在SQL Server 2008R上運行。謝謝你在前進用nvarchar更新DATEADD?

UPDATE C 
    SET [ExpirationDate] = DATEADD(MONTH, 

    (CASE WHEN ISNUMERIC(C.Renewal)= 1 
      THEN CAST(C.Renewal AS INT) 
      ELSE 0) 

    , [ExpirationDate]) 
    FROM dbo.MyTable C 
    WHERE C.MyCondition = 'True' 
+1

您錯過了單詞END。 Google適當的SQL Server CASE WHEN語法。 – dfundako

回答

3

你只numeric值丟失ENDCASE聲明

UPDATE C 
SET [ExpirationDate] = Dateadd(MONTH, (CASE 
              WHEN Isnumeric(C.Renewal) = 1 THEN Cast(C.Renewal AS INT) 
              ELSE 0 
              END), [ExpirationDate]) 
FROM dbo.MyTable C 
WHERE C.MyCondition = 'True' 

篩選記錄和應用而不是增加0個月

而且ISNUMERIC不優選DATEADD功能。 ISNUMERIC如果字符串可以轉換爲整數,數字/小數點,浮點數或金錢中的任何一個,則返回1。 https://connect.microsoft.com/SQLServer/feedback/details/302466/isnumeric-returns-true-for-and

UPDATE C 
    SET [ExpirationDate] = DATEADD(MONTH,CAST(C.Renewal AS INT), [ExpirationDate]) 
    FROM dbo.MyTable C 
    WHERE C.MyCondition = 'True' 
    AND C.Renewal NOT LIKE '%[^0-9]%' 
+0

加分(如果我可以)指出使用ISNUMERIC的弱點:) – Darkloki

1

這將是更簡單。

UPDATE C 
SET [ExpirationDate] = DATEADD(MONTH, CAST(c.Renewal AS INT), [ExpirationDate]) 
FROM dbo.MyTable C 
WHERE C.MyCondition = 'True' 
AND ISNUMERIC(c.Renewal) = 1