2016-12-27 2 views
0

[Renewal]列がnvarchar(255)、nullに設定されているテーブルがついています。私の手仕事ではなく、私はそれを変更できません。この列を計算に使用する必要があります。私は1つのステートメントでそれをやっていくことができますが、ELSEステートメントの後には、 "間違ったシンタックスの近くに..."というエラーは表示されません。それがINTとしてCASTしようとする問題に遭遇したなら、私はレコードの残りの部分を続行し、クエリ全体をホースしないことを望みます。私はINT、ヌルではない追加の列を追加し、これより前に実行する更新文を書くことができると思いますが、私は同じ問題に遭遇する恐れがあります。私はSQLの男よりもUIの男、任意の提案ですか? SQL Server 2008R上で動作します。あなたが唯一のnumeric値でENDフィルターDATEADDをnvarcharで更新しますか?

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' 

声明CASEのレコードが欠落している

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ケースWHEN構文。 – dfundako

答えて

3

事前にありがとうございますし、代わりに好ましくない0ヶ月

また

ISNUMERICに追加するのでDATEADD関数を適用。 ISNUMERICは、文字列をint、numeric/decimal、float、またはmoneyのいずれかに変換できる場合は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 
関連する問題