sql
  • sql-server
  • xml
  • 2016-04-11 18 views 0 likes 
    0

    次のエラーが発生します。 msgstr "データ型varcharを数値に変換中にエラーが発生しました。"XML変換の問題

    これは、XML入力からデータを選択しようとしたときに発生します。以下はコードです

    DECLARE @XmlIn XML = '<rec> 
    <targetId>10</targetId> 
    <categoryId>4</categoryId> 
    <percent>2</percent> 
    <AgreementDurationMin></AgreementDurationMin> 
    <AgreementDurationMax></AgreementDurationMax> 
    </rec>' 
    
    INSERT INTO WizzTable 
         (CommissionTargetId , 
          CommissionPercentageCategoryId , 
          Percentage , 
          AgreementDurationMin , 
          AgreementDurationMax 
         ) 
         SELECT targetId = NULLIF(cb.n.value('(targetId)[1]', 'INT'), 
                '') , 
           categoryId = NULLIF(cb.n.value('(categoryId)[1]', 
                   'SMALLINT'), '') , 
           percentage = NULLIF(cb.n.value('(percent)[1]', 
                   'DECIMAL(17,2)'), '') , 
           AgreementDurationMin = ISNULL(NULLIF(cb.n.value('(AgreementDurationMin)[1]', 
                      'INT'), ''), 0) , 
           AgreementDurationMax = NULLIF(cb.n.value('(AgreementDurationMax)[1]', 
                     'INT'), '') 
         FROM @XmlIn.nodes('rec') cb (n) 
         WHERE cb.n.value('(percent/text())[1]', 'INT') > 0 
    

    アイデアをお持ちですか?ありがとう!

    +0

    RDMSにタグを付けてください。 – Parfait

    +0

    私の謝罪Shnugo。私はそれを考慮に入れます。私はそれがそれほど大きな取引であったことに気づいていませんでした。私はまた、(間違って) "マークされた回答"がアップ投票と同等であると仮定しました... – akaWizzmaster

    答えて

    1

    何パーセントの要素型タイプは、expression1とexpression2のために同じでなければなりませんか?あなたはそれをDECIMAL(17,2)に変換しようとします。 where句ではINTです。

    Nullifのデフォルト値にエラーがあります。 Sqlは ''を10進数に変換できません。

    修正:SQL構文が変化するよう

    DECLARE @XmlIn XML = '<rec> 
    <targetId>10</targetId> 
    <categoryId>4</categoryId> 
    <percent>2</percent> 
    <AgreementDurationMin></AgreementDurationMin> 
    <AgreementDurationMax></AgreementDurationMax> 
    </rec>' 
    
    INSERT INTO WizzTable 
         (CommissionTargetId , 
          CommissionPercentageCategoryId , 
          Percentage , 
          AgreementDurationMin , 
          AgreementDurationMax 
         ) 
         SELECT targetId = NULLIF(cb.n.value('(targetId)[1]', 'INT'), 
                '') , 
           categoryId = NULLIF(cb.n.value('(categoryId)[1]', 
                   'SMALLINT'), '') , 
           percentage = NULLIF(cb.n.value('(percent)[1]', 
                   'DECIMAL(17,2)'), '0') , 
           AgreementDurationMin = ISNULL(NULLIF(cb.n.value('(AgreementDurationMin)[1]', 
                      'INT'), ''), 0) , 
           AgreementDurationMax = NULLIF(cb.n.value('(AgreementDurationMax)[1]', 
                     'INT'), '') 
         FROM @XmlIn.nodes('rec') cb (n) 
         WHERE cb.n.value('(percent/text())[1]', 'DECIMAL(17,2)') > 0 
    
    1

    あなたはここに

    ... = NULLIF(something,'') 
    

    空の文字列が数値コンテキストでは有効ではありません空の文字列を設定しています。 https://msdn.microsoft.com/en-us/library/ms177562.aspx

    はこのようにそれを試してみてください:

    SELECT targetId = NULLIF(cb.n.value('(targetId)[1]', 'INT'), 
              0) , 
         categoryId = NULLIF(cb.n.value('(categoryId)[1]', 
                 'SMALLINT'), 0) , 
         percentage = NULLIF(cb.n.value('(percent)[1]', 
                 'DECIMAL(17,2)'), 0) , 
         AgreementDurationMin = ISNULL(NULLIF(cb.n.value('(AgreementDurationMin)[1]', 
                    'INT'), 0), 0) , 
         AgreementDurationMax = NULLIF(cb.n.value('(AgreementDurationMax)[1]', 
                    'INT'), 0) 
    FROM @XmlIn.nodes('rec') cb (n) 
    WHERE cb.n.value('(percent/text())[1]', 'INT') > 0 
    
    関連する問題