为什么针对 SQL Server 2005 中的空表而不是 SQL Server 2012 从 Union All 返回零长度空格

5 sql-server-2005 sql-server sql-server-2012

支持带有 SQL Server 2005 后端的现有 VB6 应用程序,我们正在将数据库服务器迁移到 SQL Server 2012。创建生产数据库的备份并将其恢复到两台服务器上的开发数据库中。除了服务器版本之外,数据库是相同的,并且兼容级别仍设置为 90 (SQL Server 2005)。

当我在 SQL Server 2005 上运行查询时,类似于下面的示例,返回一个字符串,其中任何空白字段都有额外的空格。如果我在 SQL Server 2012 上运行相同的查询,则不会返回额外的空格。据我所知,UNION ALL对没有记录和 char 数据类型的表执行似乎是一个问题,但我还是想问一下。

对于下面的例子中你需要创建一个表一个NOT NULLChar(2)列命名Unit6。将表留空,一旦创建就没有记录。

CREATE TABLE [dbo].[tblTest](
    [Unit6] [char](2) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

当我运行以下查询时,我收到两种不同的结果,具体取决于服务器版本:

SELECT 
   Unit5, Unit6,
   LEN(Unit6) as Len_Unit6, 
   '--|' + Unit6 + '|--' as Spanner
FROM
   (SELECT      
       '13' as Unit5,
       '' as Unit6
    UNION ALL
    SELECT      
        '',
        Unit6 
    FROM tblTest) as MyData
Run Code Online (Sandbox Code Playgroud)

SQL Server 2005 上的结果

SQL 2005 结果

SQL Server 2012 上的结果

SQL 2012 结果

希望您可以看到 Spanner 列在 2005 年运行时显示两个空格,而在 2012 年运行时显示零个空格。

这是一个主要问题,因为该应用程序运行类似于上述示例的查询,然后使用字符串函数来分割单个字符串以进行数据库插入和更新。如果没有 SQL Server 2005 中包含的空格,字符串函数就会分割错误的部分,从而导致任何插入或更新失败。

任何信息都会是最有帮助的。谢谢!

服务器版本

Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) 
Nov 24 2008 13:01:59 
Copyright (c) 1988-2005 Microsoft Corporation
Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

Microsoft SQL Server 2012 (SP1) - 11.0.3393.0 (X64) 
Oct 25 2013 19:04:40 
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
Run Code Online (Sandbox Code Playgroud)

小智 1

检查 ANSI_PADDING 设置:

控制列存储短于列的定义大小的值的方式,以及列存储 char、varchar、binary 和 varbinary 数据中具有尾随空格的值的方式。

http://msdn.microsoft.com/en-us/library/ms187403.aspx


我刚刚在 SQL Server 2005 和 2012 上尝试过,但没有得到这些结果:

Unit5 Unit6 Len_Unit6   Spanner
----- ----- ----------- --------
13          0           --||--

(1 row(s) affected)


Microsoft SQL Server 2005 - 9.00.5000.00 (Intel X86) 
    Dec 10 2010 10:56:29 
    Copyright (c) 1988-2005 Microsoft Corporation
    Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)

(1 row(s) affected)


Unit5 Unit6 Len_Unit6   Spanner
----- ----- ----------- --------
13          0           --||--

(1 row(s) affected)


Microsoft SQL Server 2012 (SP1) - 11.0.3349.0 (X64) 
    Mar  8 2013 17:33:56 
    Copyright (c) Microsoft Corporation
    Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)

(1 row(s) affected)
Run Code Online (Sandbox Code Playgroud)