我遇到了一个有一个列的表,[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'
答案 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