我正在进行将数据库从 SQL Server 2005 迁移到 2008 的项目。
在测试过程中我发现了一个不一致的地方。依据BOLhttp://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 甚至删除了合法的尾随空格,更不用说它会将 char(25)
视为 varchar(25)
。 SQL Server 2008 中的 T-SQL 更仔细地处理类型,并根据接收到的转换类型返回结果
我在不同的 T-SQL 对象中拥有数字位置,主要是在触发器中。主要思想只是进行最小的更改以在 SQL Server 2008 中保持相同的行为
可能的方法
- 覆盖内置
REPLACE
功能快速搜索表明这是不可能的,但我的队友想要研究该选项 - 将
Rtrim()
函数与REPLACE
一起使用。这将需要在多个例程中的代码中的确切位置进行替换(使用 char 列的位置) - 在 CLR 中创建自己的版本替换,以查看 CLR 允许我保留 SQL Server 2005 行为,然后在确切位置再次搜索和替换函数
请问大家有没有遇到过这个问题,你们是怎么解决的?
也欢迎任何建议,可能我只是不知道服务器实例或数据库级别的哪些设置可以改变行为。
提前谢谢您!
最佳答案
你有不同的SET ANSI_PADDING选项,也可以通过 SET ANSI_DEFAULTS 控制
就目前情况而言,REPLACE 在两个版本中的行为相同。两者( 2005 、 2008 )都说:
Returns nvarchar if one of the input arguments is of the nvarchar data type; otherwise, REPLACE returns varchar.
编辑:有 2 个 Connect 错误/功能
我上面的回答可能是错误的
检查数据库兼容级别:
作为修复,抱歉,我会使用 rtrim,但是它是修复吗?您无法覆盖替换,如果您计划紧急 clr,为什么不将替换/rtrim 包装在 SQL udf 中
关于sql - T-SQL 2008 中的 REPLACE 函数与 T-SQL 2005 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6985499/