sql - T-SQL 2008 中的 REPLACE 函数与 T-SQL 2005 不同

标签 sql sql-server tsql replace

我正在进行将数据库从 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 在两个版本中的行为相同。两者( 20052008 )都说:

Returns nvarchar if one of the input arguments is of the nvarchar data type; otherwise, REPLACE returns varchar.

编辑:有 2 个 Connect 错误/功能

我上面的回答可能是错误的

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

检查数据库兼容级别:

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

作为修复,抱歉,我会使用 rtrim,但是它是修复吗?您无法覆盖替换,如果您计划紧急 clr,为什么不将替换/rtrim 包装在 SQL udf 中

关于sql - T-SQL 2008 中的 REPLACE 函数与 T-SQL 2005 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6985499/

相关文章:

mysql - 触发器在 PhpMyAdmin sql 选项卡中不起作用

sql - T-SQL 存储过程

sql-server - 如何在 T-SQL 中获取版本号(varchar)列的 MAX 值

sql-server - 防止 SQL Server 生成的 XML 中的自闭合标记

mysql - SQL,如何从不同表中选择属性?

mysql - 从文本中删除\n\r 的 sql 查询是什么?

sql-server - SQL Server跨不同版本开发的最佳实践

c# - 嵌套 linq 查询中的“列名 [ColumnName] 无效”

python - 在 Mac 上使用 isql 和 python 连接到远程 MSSQL 2016?

mysql - 为 MySQL 中的临时表授予选择