Хранимая процедура и язык программирования 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),'')