我正在从SQL Server 2008 R2升级到SQL Server 2014.我的一个SSIS包中有一个SQL任务,它在两个不同的SQL版本中产生不同的结果。
这是我在两个版本中运行的SQL。列MfgPartNbr
是CHAR(50)
列。
Select REPLACE(MfgPartNbr, ' ', '0') NewCol, MfgPartNbr
From Table
SQL Server 2014中的结果是:
NewCol MfgPartNbr
04090226000000000000000000000000000000000000000000 04090226
04090481000000000000000000000000000000000000000000 04090481
SQL Server 2008 R2中的结果是:
NewCol MfgPartNbr
04090226 04090226
04090481 04090481
添加一些新信息 - 我将2008和2014 SQL服务器设置为链接服务器(我可以从任一个访问)。
因此,当我在SQL 2008框Management Studio中运行这些语句时,我正在从两个服务器中选择记录。他们都不会返回零。
当我在SQL 2014框管理工作室中运行语句时,我将再次从两个服务器中选择记录。但是现在他们两个都归零了。
我对行为的差异非常非常好奇。
答案 0 :(得分:2)
这样做的原因是该列是CHAR
类型。 CHAR
将始终包含字段末尾的空格,直到它支持的长度。因此,当您在其上运行REPLACE()
时,这些额外的空格将成为0
s。
要解决这个问题,你应该在进行替换之前在字段上执行RTRIM()
:
REPLACE(RTRIM(MfgPartNbr), ' ', '0')
行为举例:
Declare @Char Char (50) = 'Hi'
Select Replace(@Char, ' ', '0') As WithoutTrim,
Replace(RTRIM(@Char), ' ', '0') As WithTrim
WithoutTrim WithTrim
Hi000000000000000000000000000000000000000000000000 Hi
如果您不需要/希望使用{{1}的开销和空间填充,您可能还需要考虑将字段的数据类型更改为VARCHAR
而不是CHAR
}。
答案 1 :(得分:0)
2008年究竟做了什么?在您的示例中,NewCol与MfgPartNbr ??
相同我认为在升级过程中,您的数据已经填充了尾随空格。替换函数通过用零替换空格来完成其工作。试试RTRIM()为:
选择REPLACE(RTRIM(MfgPartNbr),'',' 0')NewCol,MfgPartNbr 从表
如果这给出了预期结果,那么您可能希望使用RTRIM更新所有MfgPartNbr值(MfgPartNbr)