Я нахожусь в процессе миграции баз данных с 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, а затем снова искать и заменять функцию в точном месте
Я хотел бы спросить всех, сталкивался ли кто-нибудь с этой проблемой, как вы справились?
Также приветствуются любые предложения, может быть, я просто не знаю, какие настройки на уровне экземпляра сервера или базы данных могут изменить поведение.
Заранее спасибо!