Почему при конкатенации varchars в этом запросе SQL 2008 есть пробел? - PullRequest
0 голосов
/ 27 сентября 2019

Мне было поручено установить контрольный номер на основе месяца и даты, которые передаются в хранимую процедуру.Я пропускаю месяц и год, но мне нужно добавить месяц, чтобы 1-9 отображались как 01-09, так как количество символов должно оставаться неизменным для импорта.Мой результат должен дать Z_0 + месяц + год в виде 9-символьного поля, например Z_0201901 за январь 2019 года.

Я использовал этот пост Как я могу получить номер месяца (не название месяца) из датыв SQL Server? , чтобы дополнить 0 в месяц.В частности, SELECT RIGHT('00' + RTRIM( CAST( DATEPART( MONTH, GETDATE() ) AS varchar(2)) ) , 2).

Мои проблемы заключаются в том, что я каким-то образом вставляю пробел, когда объединяю месяц и год, даже если каждая переменная в отдельности НЕ содержит пробел.

Учтите:

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, все равно дает тот же результат, что и пробел.

Запуск 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, нос помощью переполнения стека обнаружил, что функция недоступна до SQL Server 2012.

Что вызывает пространство?Это не имеет никакого смысла для меня.

Ответы [ 3 ]

3 голосов
/ 27 сентября 2019

Вы объявили @Year как char(6).Таким образом, он всегда будет иметь 6 символов.Любые символы, не используемые при установке строки, будут дополнены пробелами.Таким образом, ваша строка @Year становится '02019', когда вы устанавливаете ее на '02019'.Объявите это как char(5) или varchar.Тогда значение будет равно «02019», так что при объединении строк вы получите желаемое «Z_0201905».

0 голосов
/ 27 сентября 2019
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 ;
0 голосов
/ 27 сентября 2019

Короткий ответ

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] ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...