Как заполнить поле NVARCHAR нулями, используя T-SQL в БД SQL Server 2005? - PullRequest
1 голос
/ 10 июля 2009

У меня есть таблица заказов, в которой хранится порядковый номер как NVarChar. Мы вручную увеличиваем номер заказа, запрашивая порядок наибольшего номера заказа в порядке убывания и возвращая верхнюю 1, а затем добавляя 1. Это реализовано в Microsoft CRM 4.0.

например, номера заказов (NVarchar)

99
456
32

Когда я запрашиваю вышеуказанные значения, он возвращает 99 вместо 456. Я хочу дополнить все номера текущего заказа чем-то вроде 000099 или 000456, используя скрипт SQL в SQL Server 2005. Поэтому приведенный выше пример будет

000099
000456
000032

Какой сценарий SQL мне нужно написать для достижения этой цели?

Ответы [ 5 ]

11 голосов
/ 10 июля 2009

Вот отличное учебное пособие по LessThanDot .

DECLARE @Numbers TABLE
(Num INT) 

INSERT @Numbers VALUES('1')
INSERT @Numbers VALUES('12')
INSERT @Numbers VALUES('123')
INSERT @Numbers VALUES('1234')
INSERT @Numbers VALUES('12345')
INSERT @Numbers VALUES('123456')
INSERT @Numbers VALUES('1234567')
INSERT @Numbers VALUES('12345678')   

SELECT RIGHT(REPLICATE('0', 8) + CONVERT(NVARCHAR(8),Num),8) FROM @Numbers

Это приведет к:

00000001
00000012
00000123
00001234
00012345
00123456
01234567
12345678
3 голосов
/ 10 июля 2009

не делайте так! сохраняйте значения как INT. Вы будете навсегда пойманы в ловушку с нулями, если будете использовать строки. Если вы решите сохранить нули в строках, вам все равно придется заполнять вводимые пользователем данные нулями, чтобы запросить его (или использовать как '%' + @ x + '%', yikes!)

1 голос
/ 17 января 2013

Я только что наткнулся на это, и я знаю, что об этом спрашивали довольно давно, но так как я знаю другое, возможно, более простое решение, я решил поделиться.

ПРИМЕЧАНИЕ: Этобудет работать только для столбцов, которые вы хотите заполнить, содержать только числовые символы .Это связано с тем, что функция STR () принимает значение с плавающей точкой в ​​качестве первого параметра, и любые строки будут преобразованы в число с плавающей точкой, прежде чем снова преобразовывать в более длинные строки.

В основном - это:

SELECT REPLACE(STR('872', 8), ' ', '0')

выдаст 00000872

1 голос
/ 10 июля 2009

Вы можете ОТКАЧАТЬ NVARCHAR в INT, и тогда порядок будет работать, как вы хотите. Я предполагаю, что номера заказов содержат только числовые символы.

ORDER BY
    CAST(OrderNumber AS INT)
0 голосов
/ 11 июля 2009

Это, в основном, переписывание ответа, заданного pcampbell, но с использованием функций, которые я обнаружил, что проще найти порт для другого продукта SQL: CAST вместо CONVERT и т. Д .:

SELECT CAST(REVERSE(CAST(REVERSE(CAST(Num AS NVARCHAR(9))) + '000000000' AS NCHAR(9))) AS NVARCHAR(9))
       AS value_padded
 FROM Numbers;
...