为什么在此 SQL 2008 查询中连接 varchar 时会出现 space?

Why is there a space when concatenating varchars in this SQL 2008 query?

我的任务是根据传递到存储过程的月份和日期设置控制编号。我过了一个月和一年,但我需要填充月份,以便 1-9 显示为 01-09,因为字符数必须保持不变才能导入。我的结果应该产生 Z_0+month+year 作为 9 个字符的字段,例如 Z_0201901 表示 2019 年 1 月。

我用这个 post How can I get the month number (not month name) from a date in SQL Server? 来填充月份中的 0。具体来说 SELECT RIGHT('00' + RTRIM( CAST( DATEPART( MONTH, GETDATE() ) AS varchar(2)) ) , 2).

我的问题是,当我连接月份和年份时,我以某种方式插入了 space,即使每个变量单独不包含 space。

考虑:

DECLARE @Mon char(3),
        @Year char(6)

SET @Mon = '5'
SET @Year = '2019'

SET @Mon = RIGHT('00' + RTRIM(CAST(@Mon as varchar(2))), 2)
SET @Year = RIGHT('00' + RTRIM(CAST(@Year AS varchar(4))), 5)
SELECT @Year
SELECT @Mon
SELECT @Year+@Mon

SELECT 'Z_' + @Year + @Mon ;

预期结果是我会得到 Z_0201905 但我得到 Z_02019 05。 最初我认为这是因为我将 @Mon 声明为 char(3) 但即使将其更改为 char(2) 也具有相同的行为。 将 @Year 更改为 char(5) 并将 0 添加到 SELECT 'Z_0' + @Year + @Mon; 会产生相同的结果。 将 @Mon 变量设置为高于 9 的值(例如 12)仍然会产生与 space.

相同的结果

运行 SELECT @@VERSION 产量:Microsoft SQL Server 2008 (SP3) - 10.0.5538.0 (X64) Apr 3 2015 14:50:02 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)

我尝试使用 CONCAT,但通过 Stack Overflow 发现该功能在 SQL Server 2012 之前不可用。

是什么导致了 space?这对我来说没有任何意义。

您已将 @Year 声明为 char(6)。因此它总是有 6 个字符。设置字符串时未使用的任何字符都将用空格填充。因此,当您将 @Year 字符串设置为“02019”时,它会变为“02019”。将其声明为 char(5)varchar。然后该值将是 '02019' 这样当字符串连接时你将得到你想要的 'Z_0201905'.

简答

DECLARE @Mon char(2),
        @Year char(5)

我已经更新了你的脚本并更改了输出,所以你可以看到发生了什么。

DECLARE @Mon char(3),
        @Year char(6)

SET @Mon = '5'
SET @Year = '2019'

SET @Mon = RIGHT('00' + RTRIM(CAST(@Mon as varchar(2))), 2)
SET @Year = RIGHT('00' + RTRIM(CAST(@Year AS varchar(4))), 5)
--SELECT @Year
--SELECT @Mon
--SELECT @Year+@Mon
SELECT 'Z_' + @Year + @Mon ;
SELECT 'Z_' + '-->' + @Year + '<-- -->' + @Mon + '<--' as [has extra spaces] ;

go

DECLARE @Mon char(2),
        @Year char(5)

SET @Mon = '5'
SET @Year = '2019'

SET @Mon = RIGHT('00' + RTRIM(CAST(@Mon as varchar(2))), 2)
SET @Year = RIGHT('00' + RTRIM(CAST(@Year AS varchar(4))), 5)
--SELECT @Year
--SELECT @Mon
--SELECT @Year+@Mon
SELECT 'Z_' + @Year + @Mon ;
SELECT 'Z_' + '-->' + @Year + '<-- -->' + @Mon + '<--' as [no extra spaces] ;
DECLARE @Mon varchar(3),
        @Year varchar(5)

SET @Mon = '5'
SET @Year = '2019'

SET @Mon = RIGHT('00' + RTRIM(CAST(@Mon as varchar(2))), 2)
SET @Year = RIGHT('00' + RTRIM(CAST(@Year AS varchar(4))), 5)
SELECT @Year
SELECT @Mon
SELECT @Year+@Mon

SELECT 'Z_' + @Year + @Mon ;