2016-09-16 1 views
1

Я обновляюсь с SQL Server 2008 R2 до SQL Server 2014. У меня есть задача SQL в одном из моих пакетов SSIS, который дает разные результаты в двух разных версиях SQL.Заменить функцию в SQL Server 2014 добавляет конечные нули в поле Char

Это SQL, который я запускаю в обеих версиях. Столбец MfgPartNbr представляет собой столбец CHAR(50).

Select REPLACE(MfgPartNbr, ' ', '0') NewCol, MfgPartNbr 
From Table 

Результаты в SQL Server 2014 являются:

NewCol            MfgPartNbr 
04090226000000000000000000000000000000000000000000 04090226           
04090481000000000000000000000000000000000000000000 04090481  

Результаты в SQL Server 2008 R2 являются:

NewCol  MfgPartNbr 
04090226 04090226           
04090481 04090481  

Чтобы добавить новую информацию - У меня есть 2008 и 2014 SQL Server настроены как подключенные серверы (я могу получить доступ либо из них).

Поэтому, когда я запускаю эти инструкции в окне управления SQL 2008, я выбираю записи с обоих серверов. Оба они НЕ возвращают нули.

Когда я запускаю операторы в блоке управления SQL 2014 Management Studio, я снова выбираю записи с обоих серверов. Однако теперь они оба возвращают нули.

Я просто очень, очень интересуюсь различием в поведении.

+0

Что такое тип данных 'NewCol'? – alroc

ответ

2

Причина, по которой это делается, потому что столбец является CHAR. CHAR всегда будет включать пробелы в конце поля, вплоть до поддерживаемой длины. Поэтому, когда вы запускаете REPLACE() над ним, эти дополнительные пробелы становятся 0 s.

Чтобы обойти эту проблему, вы должны сделать RTRIM() на поле перед выполнением замены:

REPLACE(RTRIM(MfgPartNbr), ' ', '0') 

Пример поведения:

Declare @Char Char (50) = 'Hi' 

Select Replace(@Char, ' ', '0') As WithoutTrim, 
     Replace(RTRIM(@Char), ' ', '0') As WithTrim 

WithoutTrim           WithTrim 
Hi000000000000000000000000000000000000000000000000 Hi 

You может также хотеть рассмотреть возможность изменения тип данных поля на VARCHAR вместо CHAR, если вам не нужны/нужны служебные и пространственные пробелы с использованием CHAR.

+0

Я понимаю, как с этим бороться.То, что я хотел бы знать, - это то, почему результаты в SQL 2014 и SQL 2008. отличаются друг от друга. Он добавляет завершающие нули в 2014 году, он НЕ добавляет их в 2008 году. Спасибо! –

+0

@StefanN Вы уверены, что в 2008 году он определен как «CHAR», а не «VARCHAR»? И если да, то какова длина его в версии 2008 года? – Siyual

+0

Да, это Char в обоих местах, длина 50. Я сравнивал две таблицы. –

0

Что именно он делает в 2008 году? В вашем примере NewCol такой же, как MfgPartNbr ??

Я думаю, что во время обновления ваши данные были заполнены конечными пробелами. Заменить функцию выполняет свою работу, заменив пробелы нулями. Попробуйте RTRIM() как:

Выберите ЗАМЕНА (RTRIM (MfgPartNbr), '', '0') NEWCOL, MfgPartNbr Из таблицы

Если это дает ожидаемый результат, то вы можете обновить все значения MfgPartNbr с RTRIM (MfgPartNbr)

+0

Половина это старые (обновленные) данные, а половина из них - новые данные, которые загружаются в хранилище данных. Я обновил его (удалили нули), но выполнение этого оператора Select в 2014 году всегда возвращает дополнительные нули. Я знаю, как справляться с ситуацией, однако я хотел бы знать, почему она ведет себя по-другому в 2008 и 2014 годах. –