CaptainChizni Ответов: 2

Увеличение значения с помощью обновления


UPDATE MembersTest 
   Set StudentID = CONCAT('S-000',[key])
   WHERE [key] = [key]


Что я уже пробовал:

Любые решения о том, как увеличить значение с помощью update без использования приведенного выше кода

2 Ответов

Рейтинг:
18

OriginalGriff

Этот код ничего не увеличивает: он устанавливает значение столбца в фиксированную строку и существующее значение столбца.
И есть лучший способ сделать это в любом случае: Указание вычисляемых столбцов в таблице - SQL Server | Microsoft Docs[^] Используйте это, и данные столбца не нужно хранить или обновлять вообще - экономия места - и их можно получить в любое время с помощью обычного выбора.

Но увеличение значений с помощью обновления в БД-плохая идея: они приводят к прерывистым и труднодоступным проблемам в производстве, потому что в какой - то момент два или более пользователей попытаются обновить одно и то же значение для разных строк-и в результате ваши данные будут скомпрометированы. Вместо того чтобы вручную увеличивать значения, используйте столбец идентификаторов, и пусть SQL разберется с этим за вас - вам все равно не нужно знать студенческий билет, прежде чем данные будут сохранены в БД - Честное слово! IDENTITY (Property) (Transact-SQL) - SQL Server | Microsoft Docs[^]


CaptainChizni

Во всяком случае, есть какие-нибудь решения о том, как увеличить varchar?

OriginalGriff

Просто: не надо. Значения VARCHAR и NVARCHAR не являются числовыми, поэтому у них нет понятия "инкремент" или "декремент": это есть только в числовых полях.

Единственный способ приращения можно было бы быть, чтобы преобразовать его в числовой тип, приращение это, и преобразовать его обратно - и это означает, что ваш ДБ конструкция небезупречна, что вы должны быть хранение ценностей в *нужный* тип данных: числа в цифры, даты, даты, даты и времени, или datetime2, и только истинные строки в столбцы varchar или nvarchar - в противном случае это рецепт для последующих сложности и неудачи, как поле будет в какой-то момент содержать "плохих данных".
Независимо от того, насколько проще "просто использовать VARCHAR повсюду", это позже дает вам проблемы, которые действительно неприятно сортировать, и увеличивает сложность всего, что вы делаете с вашими данными позже.

Рейтинг:
0

RickZeeland

Хотя Грифф прав, другим вариантом было бы использовать ПОСЛЕДОВАТЕЛЬНОСТЬ, смотрите объяснение здесь: Создание последовательности (Transact-SQL) - SQL Server | Microsoft Docs[^]

Вы можете привести порядковый номер к varchar следующим образом:

CAST(NEXT VALUE FOR MySequence AS NVARCHAR(10))