为什么在此 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 ;
我的任务是根据传递到存储过程的月份和日期设置控制编号。我过了一个月和一年,但我需要填充月份,以便 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 ;