Форматирование чисел путем заполнения начальными нулями в SQL Server - PullRequest
107 голосов
/ 01 марта 2012

У нас есть старая таблица SQL, которая использовалась SQL Server 2000 в течение почти 10 лет.

В ней наши значки сотрудников хранятся в виде char(6) от 000001 до 999999.

Я сейчас пишу веб-приложение, и мне нужно хранить номера значков сотрудников.

В моей новой таблице я могу взять короткий путь и скопировать старую таблицу, но я надеюсь,для лучшей передачи данных, меньшего размера и т. д., просто сохраняя значения int от 1 до 999999.

В C # я могу быстро отформатировать значение int для номера значка, используя

public static string GetBadgeString(int badgeNum) {
  return string.Format("{0:000000}", badgeNum);
  // alternate
  // return string.Format("{0:d6}", badgeNum);
}

Как бы я изменил этот простой запрос SQL для форматирования возвращаемого значения?

SELECT EmployeeID
FROM dbo.RequestItems
WHERE ID=0

Если EmployeeID равно 7135, этот запрос должен вернуть 007135.

Ответы [ 12 ]

158 голосов
/ 01 марта 2012

Измените число 6 на любое значение общей длины:

SELECT REPLICATE('0',6-LEN(EmployeeId)) + EmployeeId

Если столбец является INT, вы можете использовать RTRIM для неявного преобразования его в VARCHAR

SELECT REPLICATE('0',6-LEN(RTRIM(EmployeeId))) + RTRIM(EmployeeId)

И код для удаления этих нулей и возврата «реального» числа:

SELECT RIGHT(EmployeeId,(LEN(EmployeeId) - PATINDEX('%[^0]%',EmployeeId)) + 1)
102 голосов
/ 31 июля 2014

Просто используйте функцию FORMAT (работает на SQL Server 2012 или новее):

SELECT FORMAT(EmployeeID, '000000')
FROM dbo.RequestItems
WHERE ID=0 

Ссылка: http://msdn.microsoft.com/en-us/library/hh213505.aspx

30 голосов
/ 01 марта 2012

Вы можете изменить свою процедуру следующим образом

SELECT Right('000000' + CONVERT(NVARCHAR, EmployeeID), 6) AS EmpIDText, 
       EmployeeID
FROM dbo.RequestItems 
WHERE ID=0 

Однако предполагается, что ваше EmployeeID является числовым значением, и этот код заменяет результат на строку, я предлагаю снова добавить исходное числовое значение

РЕДАКТИРОВАТЬ Конечно, я не внимательно прочитал вопрос выше. В нем указано, что поле имеет значение char(6), поэтому EmployeeID не является числовым значением. Хотя этот ответ по-прежнему имеет значение как таковой, он не является правильным ответом на поставленный выше вопрос.

24 голосов
/ 29 июля 2014

Ненавидел необходимость конвертировать int, и это кажется намного проще.Может быть даже лучше, поскольку есть только одно преобразование строк и простое добавление.

select RIGHT (1000000 + EmployeeId, 6) ...

Просто убедитесь, что "1000000"имеет по крайней мере столько нулей, сколько необходимо для размера.

9 голосов
/ 01 октября 2015

Я выкладываю все в одном месте, у меня все работает для заполнения с 4 ведущими нулями:)

declare @number int =  1;
print right('0000' + cast(@number as varchar(4)) , 4)
print right('0000' + convert(varchar(4), @number) , 4)
print right(replicate('0',4) + convert(varchar(4), @number) , 4)
print  cast(replace(str(@number,4),' ','0')as char(4))
print format(@number,'0000')
6 голосов
/ 01 марта 2012

Другой способ, просто для полноты.

DECLARE @empNumber INT = 7123
SELECT STUFF('000000', 6-LEN(@empNumber)+1, LEN(@empNumber), @empNumber)

Или, согласно вашему запросу

SELECT STUFF('000000', 6-LEN(EmployeeID)+1, LEN(EmployeeID), EmployeeID) 
         AS EmployeeCode
FROM dbo.RequestItems
WHERE ID=0
4 голосов
/ 22 апреля 2015

Начиная с версии 2012 и далее вы можете использовать

SELECT FORMAT(EmployeeID,'000000')
FROM dbo.RequestItems
WHERE ID=0
4 голосов
/ 24 июля 2013

Как можно более чисто и дать возможность замены на переменные:

Select RIGHT(REPLICATE('0',6) + EmployeeID, 6) from dbo.RequestItems
WHERE ID=0
3 голосов
/ 01 марта 2012
SELECT replicate('0', 6 - len(employeeID)) + convert(varchar, employeeID) as employeeID
FROM dbo.RequestItems 
WHERE ID=0
2 голосов
/ 01 марта 2012
SELECT 
    cast(replace(str(EmployeeID,6),' ','0')as char(6)) 
FROM dbo.RequestItems
WHERE ID=0
...