T-SQL 2008中的REPLACE功能与T-SQL 2005不同

lik*_*tin 5 sql t-sql sql-server replace

我正在进行从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
Run Code Online (Sandbox Code Playgroud)

SQL Server 2005的结果

original                    afterreplace
--------------------------- ---------------------------
"Hello                    " "Hello"
"Hello world              " "Hello world"
"World                    " "World"
Run Code Online (Sandbox Code Playgroud)

SQL Server 2008的结果

original                    afterreplace
--------------------------- ---------------------------
"Hello                    " "Hello                    "
"Hello world              " "Hello world              "
"World                    " "World                    "
Run Code Online (Sandbox Code Playgroud)

T-SQL在SQL Server 2005中删除即使是合法的尾部空间,更不要说它威胁char(25)varchar(25).SQL Server 2008中的T-SQL更仔细地处理类型,并根据它收到的用于转换的类型返回结果

我在不同的T-SQL对象中有数字位置,主要是在触发器中.主要思想是进行最小的更改以在SQL Server 2008中保持相同的行为

可能的方法

  • 覆盖内置REPLACE功能快速搜索表明我的队友想要研究该选项是不可能的
  • 使用Rtrim()功能REPLACE.这将需要在多个例程(使用char列)中的代码中的确切位置进行替换
  • 创建自己的版本在CLR中替换以查看CLR允许我保持SQL Server 2005的行为,然后再次在确切的位置搜索和替换函数

我想问每个人是否有人遇到过这个问题,你是怎么解决的?

也欢迎任何建议,可能是我只是不知道服务器实例或数据库级别上的哪些设置可以改变行为.

先感谢您!

gbn*_*gbn 7

您有不同的SET ANSI_PADDING选项,这些选项也可以由SET ANSI_DEFAULTS控制

目前,REPLACE在两个版本中表现相同.两者(2005年,2008年)都说:

如果其中一个输入参数是nvarchar数据类型,则返回nvarchar; 否则,REPLACE返回varchar.

编辑:有2个连接错误/功能

我上面的答案可能是错的

http://connect.microsoft.com/SQLServer/feedback/details/259840/trailing-spaces-are-lost-when-a-char-value-is-fed-to-replace

检查DB兼容级别:

http://connect.microsoft.com/SQLServer/feedback/details/126092/t-sql-replace-function-seems-to-be-broken-for-char-x-variables

作为修复,对不起,我会使用rtrim,但这是一个修复?你不能覆盖替换,如果你计划clr紧急,为什么不将replace/rtrim包装在SQL udf中