用nvarchar更新DATEADD?

时间:2016-12-27 16:09:25

标签: sql-server sql-server-2008 stored-procedures

我遇到了一个有一个列的表,[Renewal]被设置为nvarchar(255),null。不是我的手工而且我无法改变它。我现在需要在计算中使用此列。下面尽可能接近我在一个语句中所做的但是我无法通过ELSE语句之后的“错误的语法接近......”错误。如果它遇到了一个尝试CAST作为INT的问题,我希望它继续使用其余的记录而不是整个查询。我想我可以添加一个INT的附加列,而不是null并写一个更新语句在此之前运行,但我担心我会遇到同样的问题。我比UI家伙更有UI人,有什么建议吗?它将在SQL Server 2008R上运行。提前谢谢

  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'  

2 个答案:

答案 0 :(得分:3)

END声明中缺少CASE

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' 

仅使用numeric值过滤记录并应用DATEADD功能,而不是添加0个月

ISNUMERIC也不是首选。如果字符串可以转换为整数,数字/小数,浮点数或金钱中的任何一个,则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]%'

答案 1 :(得分: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