【发布时间】:2011-10-22 13:34:13
【问题描述】:
我正在进行将数据库从 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 "
SQL Server 2005 中的 T-SQL 甚至删除了合法的尾随空格,并不是说它像 varchar(25) 一样威胁 char(25)。 SQL Server 2008 中的 T-SQL 更仔细地处理类型,并根据接收到的用于转换的类型返回结果
我在不同的 T-SQL 对象中有数字位置,主要是在触发器中。主要思想只是为了在 SQL Server 2008 中进行最小的更改以保持相同的行为
可能的方法
- 覆盖内置
REPLACE函数快速搜索表明不可能,但我的队友想要研究该选项 - 将
Rtrim()函数与REPLACE一起使用。这将需要在多个例程中的代码中的确切位置进行替换(使用 char 列) - 在 CLR 中创建自己的版本 Replace 以查看 CLR 允许我保留 SQL Server 2005 的行为,然后在确切位置再次搜索和替换功能
想问问大家有没有遇到过这个问题,你们是怎么解决的?
也欢迎任何建议,可能我只是不知道服务器实例或数据库级别的哪些设置可以改变行为。
提前感谢您!
【问题讨论】:
-
如果将 char(25) 更改为 nchar(25) 2005 年的结果将与 2008 年相同,我自己对原因感兴趣。
标签: sql sql-server tsql replace