Хранимая процедура и язык программирования SQL

Поэтому я работаю над редактированием существующей хранимой процедуры на сервере SQL (2008 R2). Я сталкиваюсь с некоторыми проблемами, хотя из-за моего начального уровня знания SQL. Проблема заключается в том, что требования к создаваемому отчету изменились, а значение поля изменилось с 2 на 3. Длина поля в отчете была изменена предыдущим пользователем, но они никогда не учитывали случаи, когда данные в поле содержит только 2 символа IE 20 или 03 вместо 100. Это приводит к тому, что отчет генерирует значения следующим образом: '03 XX'вместо 003XX, это проблема, потому что система, которая получает это, читает его справа налево, поэтому она будет видеть эти нулевые значения и отклонить весь отчет.

То, что я хочу сделать, это изменить существующий оператор SET на условный оператор, который добавляет заполнение '0', когда значение поля составляет всего 2 символа в длину.

то, что у меня есть в настоящее время это:

SET @SupplyQuan = ISNULL((SELECT Unit FROM dbo.Supplyvalue(@UserID)
                              WHERE Number = 3),'')

Что мне нужно, это утверждение, которое выглядит следующим образом. Термин, с которым у меня возникли проблемы, - это "Характерное значение". Я не могу найти термин SQL для значения "ячейки" или поля. Я подумал, возможно, "Columnvalue", но это не совсем правильно. Я уверен, что ответ очень элементарный, и я, вероятно, обдумываю это. Вот код

SET @SupplyQuan = ISNULL((SELECT Unit FROM dbo.Supplyvalue(@UserID)
                              WHERE Number = 3),'') IF “Charactervalue=3” ELSE IF “Charactervalue=2” THEN
SET @SupplyQuan = ISNULL('0'+(SELECT Unit FROM dbo.Supplyvalue(@UserID)
                              WHERE Number = 3),'')

2 ответа

Решение

Вы можете использовать оператор CASE и функцию LEN().

SELECT @SupplyQuan = case 
    when (len(Unit) = 3) then Unit
    when (len(Unit) = 2) then '0' + Unit
    else ''
END
FROM dbo.Supplyvalue(@UserID)
WHERE Number = 3

Однако сначала я проверил бы план запроса, и если вы видите слишком много сканирований из-за функции в имени столбца, я бы разбил его.

declare @x varchar(3)
select @x = Unit FROM dbo.Supplyvalue(@UserID) WHERE Number = 3
select @SupplyQuan = CASE
    WHEN (len(@x) = 3) then Unit
    WHEN (len(@x) = 2) then '0' + Unit
    ELSE ''
end

RIGHT('0'+Unit,3) будет префикс Unit с '0' и верните самые правые 3 символа.

SET @SupplyQuan = ISNULL((SELECT RIGHT('0'+Unit,3) FROM dbo.Supplyvalue(@UserID) WHERE Number = 3),'')
Другие вопросы по тегам