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列)中的代码中的确切位置进行替换我想问每个人是否有人遇到过这个问题,你是怎么解决的?
也欢迎任何建议,可能是我只是不知道服务器实例或数据库级别上的哪些设置可以改变行为.
先感谢您!
您有不同的SET ANSI_PADDING选项,这些选项也可以由SET ANSI_DEFAULTS控制
目前,REPLACE在两个版本中表现相同.两者(2005年,2008年)都说:
如果其中一个输入参数是nvarchar数据类型,则返回nvarchar; 否则,REPLACE返回varchar.
编辑:有2个连接错误/功能
我上面的答案可能是错的
检查DB兼容级别:
作为修复,对不起,我会使用rtrim,但这是一个修复?你不能覆盖替换,如果你计划clr紧急,为什么不将replace/rtrim包装在SQL udf中