2015-03-22 3 views
0

У меня есть старый пакет SSIS, который нуждается в обновлении. В частности, он использовал только новые записи и теперь должен обновлять и заканчивать дату или удалять записи по мере необходимости. в другом месте пакета я с успехом использовал функцию Hashbytes, чтобы оценить, какие строки необходимо обновить, взяв соответствующие наборы данных из обеих баз данных, а затем сравнив их как часть условного разделения. Проблема у меня крутится вокруг сазе в исходном запросе:Ошибка: ошибка преобразования типа данных varchar в числовой, используя функцию Hashbytes в SQL

SELECT DISTINCT 
DTBL_STUDENTS.STUDENT_ID, 
FTBL_TEST_SCORES.TEST_STUDENT_GRADE, 
DTBL_TESTS.TEST_NAME, 
DTBL_SCHOOL_DATES.DATE_VALUE AS Assessment_Date, 
DTBL_SCHOOL_DATES.SIS_SCHOOL_YEAR AS Assessment_Year, 
left(CASE 
    WHEN FTBL_TEST_SCORES.TEST_SCORE_TEXT = 'NA' 
    THEN CASE 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT_CODE = 'INTE' THEN 'High' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT_CODE = 'STRA' THEN 'Some' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT_CODE = 'BNCH' THEN 'Low' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT IN ('High', 'Some', 'Low') THEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT 
      ELSE FTBL_TEST_SCORES.TEST_SCORE_TEXT 
     END 
    ELSE CASE 
      WHEN FTBL_TEST_SCORES.TEST_SCORE_TEXT LIKE '%.0000' 
      THEN REPLACE(FTBL_TEST_SCORES.TEST_SCORE_TEXT, '.0000', '') 
      ELSE FTBL_TEST_SCORES.TEST_SCORE_TEXT 
     END 
END,12) AS TEST_SCORE_TEXT, 
CASE 
    WHEN FTBL_TEST_SCORES.TEST_SCORE_TEXT = 'NA' 
    THEN CASE 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT_CODE = 'INTE' THEN '1' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT_CODE = 'STRA' THEN '3' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT_CODE = 'BNCH' THEN '4' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT = 'High' THEN '1' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT = 'Some' THEN '3' 
      WHEN FTBL_TEST_SCORES.TEST_PRIMARY_RESULT = 'Low' THEN '4' 
      ELSE '0' 
     END 
    ELSE FTBL_TEST_SCORES.TEST_SCORE_VALUE 
END AS TEST_SCORE_VALUE, 
FTBL_TEST_SCORES.TEST_PERCENTILE_SCORE, 
DTBL_SCHOOLS.SCHOOL_HR_ID 
FROM K12INTEL_DW.DTBL_TESTS 
JOIN K12INTEL_DW.FTBL_TEST_SCORES ON FTBL_TEST_SCORES.TESTS_KEY   =  
DTBL_TESTS.TESTS_KEY 
JOIN K12INTEL_DW.DTBL_SCHOOL_DATES ON DTBL_SCHOOL_DATES.SCHOOL_DATES_KEY = 
FTBL_TEST_SCORES.SCHOOL_DATES_KEY 
JOIN K12INTEL_DW.DTBL_STUDENTS  ON DTBL_STUDENTS.STUDENT_KEY   = 
FTBL_TEST_SCORES.STUDENT_KEY 
JOIN K12INTEL_DW.DTBL_SCHOOLS  ON DTBL_SCHOOLS.SCHOOL_KEY   = 
FTBL_TEST_SCORES.SCHOOL_KEY 
WHERE DTBL_SCHOOL_DATES.SIS_SCHOOL_YEAR = 2014 
AND DTBL_STUDENTS.STUDENT_CURRENT_DISTRICT_CODE = '2180' 
AND FTBL_TEST_SCORES.TEST_STUDENT_GRADE IN ('PS', 'PK', 'KG', '01', '02', 
'03', '04', '05', '06', '07', '08') 
AND DTBL_TESTS.TEST_VENDOR IS NOT NULL 
AND FTBL_TEST_SCORES.TEST_HIGHEST_SCORE_INDICATOR IN ('Yes', '--') 

В 3 значения мне нужно хэш для сравнения являются: TEST_SCORE_TEXT TEST_SCORE_VALUE Assessment_Date

Похоже, он подавился TEST_SCORE_VALUE в функции:

HASHBYTES('SHA1',ISNULL(#Dware.TEST_SCORE_TEXT,'')+convert(varchar(10),ISNULL(TEST_SCORE_VALUE,''))+convert(varchar(50),(ISNULL(Assessment_Date,'')))) as SourceHash 

Это где я получаю ошибку «ошибка преобразования типа данных VARCHAR в числовой». Я попытался поставить исходный запрос в подзапрос и сделать select *, (function) из этого исходного запроса. Я попытался поставить оператор case в функцию hashbytes, и я попытался использовать временную таблицу. Мое предположение заключается в том, что он получает базовое значение, а не значение, генерируемое оператором case, но я не знаю, почему, или как его исправить, чтобы получить числовые значения, которые я ожидаю/желаю.

Большое спасибо за помощь!

ответ

0

Предполагая, что FTBL_TEST_SCORES.TEST_SCORE_VALUE является числовым, а затем посмотрите на свой CASE оператор, который создает TEST_SCORE_VALUE. Вы создаете строку, оценивая TEST_PRIMARY_RESULT_CODE и TEST_PRIMARY_RESULT и т. Д., Но ваш окончательный оператор ELSE, вероятно, возвращает числовое значение (FTBL_TEST_SCORES.TEST_SCORE_VALUE).

Я считаю, что Sql Server определяет тип вывода оператора CASE по последнему возвращаемому значению. (В любом случае, ITT имеет алгоритм для определения типа возвращаемого, когда отдельные THEN заявления смешиваются.)

Таким образом, он видит ваше CASE заявление как напечатал к тому, что FTBL_TEST_SCORES.TEST_SCORE_VALUE есть, что, вероятно, не согласуется с ранее varchar возвращаемых значений инструкции CASE.

Устраните это, и функция HASHBYTES должна работать, как есть.

0
+convert(varchar(10),ISNULL(TEST_SCORE_VALUE,'')) 

Оказывается, что должен был:

+convert(varchar(10),ISNULL(TEST_SCORE_VALUE,0)) 

, а затем все это работало нормально.

Смежные вопросы