powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите новичку - автоикримент поля
14 сообщений из 14, страница 1 из 1
Помогите новичку - автоикримент поля
    #32038928
dik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dik
Гость
Помогите новичку
В таблице создал ключевое поле char(4) - уникальный идентификатор записи должен быть в виде "0001", "0002" и т.д.
Очень хочется на SQL сервере прописать в триггер инсерта процедуру
чтобы при вставке записи - сервер автоматически рассчитывал новый номер

В принципе код на TSQL написал
declare @intKeyClient INT
declare @NewKeyClient nvarchar(4)
select @intKeyClient = @@rowcount
SET @NewKeyClient = right('0000'+convert(nvarchar(8),@intKeyClient+1),4)

print @NewKeyClient

Вот вопрос как и куда всунуть его в базу MSSQL - чтобы автоматически подставлялось? Как я понимаю есть 2 варианта
значение по умолчанию - но там только можно одно выражение написать
или сделать триггер-вставки - вот тут вопросы с синтаксом (у меня) написания триггера в таком виде

с уважением
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038932
XXX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так сделай автоинкрементное поле. Оно чем не подходит?
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038938
Alexandr Kapustin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала по поводу @@rowcount
@@ROWCOUNT
Returns the number of rows affected by the last statement.
т.е. то, что написано в приведенном коде - бред...
если _необходимо_, чтобы был такой уникальный код, то на вставку в таблицу пишется хранимая процедура, которая и вычисляет его (если сервер2000, то можно и триггер instead of). Алгоритм вычисления зависит от конкретной задачи (например, могут ли быть в нумерации пропуски или нет)
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038955
dik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dik
Гость
Да, есть стандартное решение через
CREATE TABLE dbClient (
KeyClient int IDENTITY(1,1),
..... и т.д.
Но в целях изучения SQL - хотелось бы сделать как строковое "0001"
Пропуски не планируются и не планируется удалений
Хотя - если все-таки будут удаления - тогда да @@rowcount не подойдет
Т.к. все-таки решить поставленную задачу?
как получить максимальный номер клиента и увеличить на 1?
и главное как подцепить хранимую процедуру - чтобы автоматически подставляла нужное значение?

с уважением
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038966
Alex_B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если сервер 2000 то можно написать функцию на T-SQL которая вернёт нужную вам строку и прописать ее в качестве default value для нужного Вам поля в таблице.
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038976
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя я и не понимаю зачем вам нужны такие ключи, но IMHO лучшим способом для вас будет создать дополнительную таблицу для хранения последнего добавленного ID.
А все добавления делать в транзакции с эксклюзивной блокировкой этой таблицы. Тогда в триггере на добавление просто извлекаете из дополнительной таблицы значение ключа и делеаете с ним все, что захотите.
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038984
Фотография Maxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 declare @index int
  declare @step int
 set @step =  0  
 set @index = (select count(*) from Table)
 set @index = @index + 1 
 if @index in (select id from Table)
  begin
   while @step !=  1 
    begin
     set @index = @index+ 1 
     if @index not in (select id from Table)set @step =  1 
    end
  end
 insert into Table values (@index,........)

Вот туповато конечно ,но помоему твою проблему решает
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32038990
Alexandr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CREATE TRIGGER [TRIGGER NAME] ON [dbo].[RC_GROUP_LIST]
FOR INSERT
AS
declare @intKeyClient INT
declare @NewKeyClient nvarchar(4)
select @intKeyClient = (max(cast(имя_поля_инкримента) as int)+1) from имя_таблицы
SET @NewKeyClient = right('0000'+convert(nvarchar(8),@intKeyClient),4)

вот и автоинкремент
count - использовать не рекомендую, т.к. может возникнуть ситуация, когда ты удалишь строку например из середины таблицы. Тогда count вернет тебе, например, 10 строк, а на самом деле последней будет не 10 а 11 строка...
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32039032
dik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dik
Гость
Большое спасибо ALL

Вопрос получился глупый (больше теоретический )- для изучения основ TSQL

Решил юзать через IDENTITY

Но как использовать инструментарий - все таки думаю надо знать

Ответ на вопрос все-таки получил!!!

Спасибо за ответы
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32039055
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно обойтись и без функции для default value:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE AutoInc (
	pk int IDENTITY ( 1 ,  1 ) NOT NULL primary key clustered,
	charpk AS (right(('000' + convert(varchar( 4 ),[PK])), 4 )) ,
	field int NULL 
)

INSERT INTO AutoInc (field) values(null)
INSERT INTO AutoInc (field) values( 1 )
INSERT INTO AutoInc (field) values( 5 )
INSERT INTO AutoInc (field) values( 273 )
INSERT INTO AutoInc (field) values( 82346 )
INSERT INTO AutoInc (field) values( 176 )

Select * from AutoInc

drop table AutoInc
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32039101
dik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dik
Гость
У меня получилось так

CREATE TABLE dbUsers1 (
KeyUser char(4) NOT NULL primary key ,
Name varchar(50) NOT NULL,
)
go
Create TRIGGER InsteadTrigger1 on [dbo].[dbUsers1]
INSTEAD OF INSERT
AS
BEGIN
declare @intKeyClient smallint
declare @NewKeyClient nvarchar(4)

if (select count(*) from dbUsers1) = 0
set @intKeyClient = 1
else
select @intKeyClient = (max(convert(smallint,KeyUser))+1) from dbUsers1

SET @NewKeyClient = right('0000'+convert(nvarchar(4),@intKeyClient),4)
INSERT INTO dbUsers1
SELECT @NewKeyClient,[Name]
FROM inserted
END
GO
INSERT INTO dbUsers1 (KeyUser,[Name])
VALUES ('9999', 'XXXXXX')
INSERT INTO dbUsers1 (KeyUser,[Name])
VALUES ('9999', 'XXXXXX')
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32039121
dik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
dik
Гость
Развивая идею возник еще вопрос
Теперь хочу создать юзер функцию на сервере - в которой будет расчет счетчика
но хотелось бы сделать функцию универсальной
чтобы туда передавать название ключа, название таблицы, длину ключа
написал такой "шедевр" :-(

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE FUNCTION [dbo].[GenerateKey] (@KeyLen smallint, @NameTable varchar( 30 ), @NameKey varchar( 30 ))  
RETURNS varchar( 20 ) AS  
BEGIN 
declare @intKey smallint 
if (select count(*) from @NameTable) =  0 
	set @intKey =  1 
else
	select @intKey = (max(convert(smallint,@NameKey))+ 1 ) from @NameTable 
RETURN right(replicate('0',@KeyLen)+convert(nvarchar(@KeyLen),@intKey),@KeyLen)
END


Понятно - не работает (и на сколько я понял и не должно)
Может подскажет кто сведующий как решить такую задачу

С уважением

ЗЫ Сильно не ругайтесь - новичек я... изучаю
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32039198
Фотография ТиБиБи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слышал (читал или видел) где-то, что сервер все равно создает свой собственный уникальный индекс (столбец), даже если он явно не указан в таблице, поэтому не морочься - используй числовой ID, а для "красивого" представления в виде "0001" используй преобразование в строку (ну и можешь хранить этот дополнительный строковый столбец, если очень захочешь).

Извиняюсь, что на ты, ничего личного! :)
...
Рейтинг: 0 / 0
Помогите новичку - автоикримент поля
    #32039241
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Полностью согласен с ТиБиБи.

"Красивое" представление четырехзначного int -

Код: plaintext
1.
2.
3.
declare @i int
set @i=...
select replicate('0', 4 -len(@i))+convert(char( 4 ),@i)

Тестировано на семерке.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите новичку - автоикримент поля
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]