#sql #sql-server
#sql #sql-сервер
Вопрос:
Мне было интересно, может ли кто-нибудь мне помочь. Я создаю простой скрипт, в котором я хочу автоматически увеличивать число в поле с номером, начинающимся с 7 0.
Пример: 00000001
Вот мой скрипт: это небольшой скрипт обновления
DECLARE @EDI NVARCHAR(55)
SET @EDI=0000000
UPDATE TESTER11111
SET @EDI=EDI=@EDI 1
WHERE ssq='education'
вместо увеличения чисел как 00000001, 00000002.
его приращение равно 1, 2, 3 и т.д.
что я делаю не так? как я могу вставить эти начальные значения 7 0?
EDI — это столбец, в который я вставляю приращения.
Комментарии:
1. Каков тип данных EDI в таблице?
Ответ №1:
Вы не можете. Что касается базы данных, 01 совпадает с 1. Если вы не хотите использовать начальные нули, вам придется создать строку, дополненную нулями, при извлечении данных из базы данных.
Редактировать
Обычно я выполняю форматирование в приложении, но бывают случаи, когда мне приходится делать это в базе данных. Вот пример, в более новых версиях может быть лучшее решение, но это то, что я использую.
SELECT REPLACE(STR(5, 8), ' ', '0')
Комментарии:
1. Точно — база данных хранит данные. Форматирование выполняется в пользовательском интерфейсе.
2. @ck (и различные другие комментаторы, работающие только с пользовательским интерфейсом) хотя я не думаю, что формат должен сохраняться в столбце таблицы, я не понимаю, как этот пример является «просто» форматированием. Каков вариант использования этих значений ID, используемых без формата?
3. @downwitch, вариант использования заключается в том, что вы хотите использовать значение id для уникальной идентификации записи. Не имеет значения, запрашивает ли ваша программа запись 001 или 1, поскольку это одно и то же значение, вы получите ту же запись. То, что хочет пользователь, похоже на запрос системы выполнить
1 1
и вернутьTWO
. «ДВА» может быть полезным способом представить пользователю 2, но это не связано с тем, как компьютер внутренне представляет число 2, которое совпадает с тем, как оно представляет 02. Как система узнает, хотите ли вы форматировать 2 как 002 или «ДВА»? Вы должны отформатировать число в соответствии с вашим приложением.4. @downwitch, кроме того, индексировать и извлекать строку намного медленнее, чем число. Использовать строку
"00000001"
в качестве индекса, когда вы можете использовать число1
, — очень плохая идея.5. Я полагаю, что могу придерживаться идеи индексирования / извлечения, хотя потребовалось бы МНОГО записей, чтобы увидеть эту разницу. Но не ясно, является ли это полем уникального идентификатора, не так ли? (И да, я знаю, что я тоже назвал это так.)
Ответ №2:
В вашей таблице есть «обычный» INT IDENTITY
столбец и есть вычисляемый столбец, который выполняет дополнительную работу:
CREATE TABLE dbo.IDTest
( ID INT IDENTITY(1,1) PRIMARY KEY,
FormattedID AS RIGHT('00000000' CAST(ID AS VARCHAR(8)), 8) PERSISTED
)
Теперь ваша таблица будет содержать такие значения, как:
ID FormattedID
1 00000001
2 00000002
..
42 00000042
..
123 00000123
Этот вычисляемый столбец сохраняется, например, вы также можете проиндексировать его, если это необходимо.
Комментарии:
1. Довольно шикарно, все еще думаю, что это не совсем то, что нужно делать в БД, но если вам пришлось, это довольно круто.
2. @invertedSpear: да, это действительно не должно быть в базе данных в первую очередь, но если вам абсолютно необходимо сохранить это, это лучший способ, на мой взгляд
Ответ №3:
Пусть таблица увеличивается (и просто хранит целые числа), но я не вижу причин, по которым я не могу придумать, чтобы не выполнить форматирование с помощью инструкции select; формат с фиксированным числом содержит столько же данных, сколько и бизнес-логика
SELECT Right(Replicate('0',8) Convert(nvarchar(8),EDI),8)
РЕДАКТИРОВАТЬ: если необходимо сохранить форматированные значения:
DECLARE @EDI NVARCHAR(55)
SET @EDI=0
UPDATE TESTER11111
SET @EDI=EDI=Right(Replicate('0',8) Convert(nvarchar(8),@EDI 1),8)
WHERE ssq='education'
Ответ №4:
Это лучше обрабатывается в вашей бизнес-логике (php, asp, coldfusion или любой другой). Приращение работает с целыми числами, а не со строками. Иначе пришлось бы проходить через весь алфавит.
Ответ №5:
попробуйте это
UPDATE TESTER11111
SET @EDI='0000000' '' 1
WHERE ssq='education'
Выберите ‘0000000’ (автоматический номер)
O/P 00000001