sql
  • sql-server
  • xml
  • 2016-04-11 3 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, как синтаксис SQL изменяется. – Parfait

    +0

    Приношу свои извинения Шнуго. Я это рассмотрю. Я не знал, что это такая же большая сделка. Я также предположил (неправильно), что «Отмеченный ответ» был бы эквивалентен Up Vote ... – akaWizzmaster

    ответ

    1

    Какой процент типа элемента? вы пытаетесь преобразовать его в DECIMAL (17,2) в свой выбор; но в вашем предложении where это INT.

    Ошибка соответствует вашему стандарту Nullif. Sql не может преобразовать '' в десятичное число.

    Fix:

    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,'') 
    

    пустая строка не является действительным в числовом контексте. Эти типы должны быть одинаковыми для expression1 и expression2: https://msdn.microsoft.com/en-us/library/ms177562.aspx

    Try это так:

    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 
    
    Смежные вопросы