SQL Server 2014中的替换功能在Char字段中添加了尾随零

时间:2016-09-16 20:46:25

标签: sql sql-server sql-server-2008-r2 sql-server-2014

我正在从SQL Server 2008 R2升级到SQL Server 2014.我的一个SSIS包中有一个SQL任务,它在两个不同的SQL版本中产生不同的结果。

这是我在两个版本中运行的SQL。列MfgPartNbrCHAR(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框管理工作室中运行语句时,我将再次从两个服务器中选择记录。但是现在他们两个都归零了。

我对行为的差异非常非常好奇。

2 个答案:

答案 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)