У нас есть старая таблица 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
.
sql
sql-server
tsql
string-formatting
jp2code
источник
источник
0
s важны для этого поля, зачемINT
вообще менять его на?FORMAT
функция, как C # :-)int
значения занимают значительно меньше местаchar(6)
, и таких записей будет несколько для каждой детали, которая будет произведена. Эффективность.DATALENGTH()
) два байта каждый. Поскольку столбец может быть в индексе, вы можете сэкономить более 2 МБ. А с добавлением других столбцов этих 2 байтов может быть достаточно, чтобы уменьшить длину строки, достаточную для сохранения страницы размером 4 КБ на строку. Будет ли это размещено на мобильной платформе, или вы можете сосредоточить свое внимание на непродуктивной области?Ответы:
Измените число 6 на любую длину, которая должна быть:
Если столбец является INT, вы можете использовать RTRIM для неявного преобразования его в VARCHAR
И код для удаления этих нулей и возврата «реального» числа:
источник
Просто используйте функцию FORMAT (работает на SQL Server 2012 или новее):
Ссылка: http://msdn.microsoft.com/en-us/library/hh213505.aspx
источник
Format
не сохраняет тип данных, но неявно преобразуется в nvarchar:select sql_variant_property(50, 'BaseType'), sql_variant_property(format(50, N'00000'), 'BaseType')
Вы можете изменить свою процедуру таким образом
Однако это предполагает, что
EmployeeID
это числовое значение, и этот код меняет результат на строку, я предлагаю снова добавить исходное числовое значениеИЗМЕНИТЬ Конечно, я не внимательно прочитал вопрос выше. В нем говорится, что это поле,
char(6)
поэтому EmployeeID не является числовым значением. Хотя этот ответ по-прежнему имеет ценность, он не является правильным ответом на поставленный выше вопрос.источник
'000000'
действительно необходимо ..?'0'
тоже работает нормально. Безопасно ли использовать только один 0 ..?07135
не возвращает007135
. Вся идея состоит в том, чтобы объединить в строку из 6 символов, состоящую из всей0
преобразованной строки EmployeedID, а затем НАЧАТЬ с правого края, взять 6 символов. Независимо от длины идентификатора, приведенный выше метод всегда возвращает строку с количеством нулевых символов, необходимых для достижения длины 6 символов'00000'
поскольку в нихEmployeeID
будет хотя бы одна цифра. НоREPLICATE()
функция кажется более подходящей, как и в других ответахНенавижу преобразовывать int, и это кажется намного проще. Возможно, даже лучше, поскольку есть только одно преобразование строки и простое добавление.
выберите ВПРАВО (1000000 + EmployeeId, 6) ...
Просто убедитесь, что в «1000000» есть как минимум столько нулей, сколько нужно.
источник
Я публикую все в одном месте, все работает для меня, чтобы добавить 4 ведущих нуля :)
источник
Другой способ, просто для полноты картины.
Или по вашему запросу
источник
С версии 2012 и выше вы можете использовать
источник
Как можно более чистым и дает возможность замены переменными:
источник
EmployeeID
столбец определен как,int
то оператор + будет рассматриваться как добавление, а не конкатенация, и поэтому нули будут потеряны. Использованиеconvert
позволит избежать этой проблемы.источник
источник
7135.0
когда я его дал7135
.Решение работает для знаковых / отрицательных чисел с ведущими нулями для всех версий Sql:
источник
Самое простое - всегда лучшее:
источник
В моей версии SQL я не могу использовать REPLICATE. ТАК я сделал это:
источник