Функция REPLACE в T-SQL 2008 отличается от T-SQL 2005

Я участвую в проекте миграции баз данных с SQL Server 2005 по 2008.

Во время теста я обнаружил одно несоответствие. В соответствии с BOL http://msdn.microsoft.com/en-us/library/ms186862 (v = SQL.100) .aspx (2008) и http://msdn.microsoft .com / en-us / library / ms186862 (v = SQL.90) .aspx (2005) возвращает varchar . Пока оба одинаковые. Однако, если мы перейдем к функции REPLACE , тип столбца char , тогда разница обнаружится. Посмотрите на этот код

declare @test table
(
  testcharstring char(25)
) 

insert into @test
  select 'Hello'
  union
  select 'World'
  union
  select 'Hello world '

select 
  '"'+testcharstring+'"' as original
  ,'"'+replace(testcharstring,'a','A')+'"' as afterreplace
  --,'"'+replace(rtrim(testcharstring),'a','A')+'"'
from @test

Результат из SQL Server 2005

original                    afterreplace
--------------------------- ---------------------------
"Hello                    " "Hello"
"Hello world              " "Hello world"
"World                    " "World"

Результат из SQL Server 2008

original                    afterreplace
--------------------------- ---------------------------
"Hello                    " "Hello                    "
"Hello world              " "Hello world              "
"World                    " "World                    "

T-SQL в SQL Server 2005 удаляет даже допустимое конечное пространство, не говоря уже о том, что он угрожает char (25) как varchar (25) . T-SQL в SQL Server 2008 более тщательно подходит к типу и возвращает результаты в соответствии с типом, который он принимает для преобразования

У меня есть числовые позиции в разных объектах T-SQL, в основном в триггерах. Основная идея просто внести минимальные изменения для сохранения того же поведения в SQL Server 2008

Возможные способы сделать это

  • Заменить встроенную функцию REPLACE Быстрый поиск предполагает, что это невозможно, однако мой товарищ по команде хочет исследовать эта опция
  • Используйте функции Rtrim () вместе с REPLACE . Это потребует замены в точных местах кода в нескольких подпрограммах (где используются столбцы char)
  • Создание собственной версии Замените в CLR, чтобы увидеть, что CLR позволяет мне сохранить поведение SQL Server 2005, а затем снова искать и заменять функцию в точном месте

Я хотел бы спросить всех, если кто-нибудь сталкивался с этой проблемой, как вы справились?

Также приветствуются любые предложения, может быть, я просто не знаю, какие настройки на экземпляре сервера или уровне базы данных могут изменить поведение.

Заранее благодарю!

5
задан MatBailie 8 August 2011 в 17:07
поделиться