|
|
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Помогите новичку В таблице создал ключевое поле 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 варианта значение по умолчанию - но там только можно одно выражение написать или сделать триггер-вставки - вот тут вопросы с синтаксом (у меня) написания триггера в таком виде с уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 07:55:45 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Так сделай автоинкрементное поле. Оно чем не подходит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 08:19:18 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Сначала по поводу @@rowcount @@ROWCOUNT Returns the number of rows affected by the last statement. т.е. то, что написано в приведенном коде - бред... если _необходимо_, чтобы был такой уникальный код, то на вставку в таблицу пишется хранимая процедура, которая и вычисляет его (если сервер2000, то можно и триггер instead of). Алгоритм вычисления зависит от конкретной задачи (например, могут ли быть в нумерации пропуски или нет) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 09:01:43 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Да, есть стандартное решение через CREATE TABLE dbClient ( KeyClient int IDENTITY(1,1), ..... и т.д. Но в целях изучения SQL - хотелось бы сделать как строковое "0001" Пропуски не планируются и не планируется удалений Хотя - если все-таки будут удаления - тогда да @@rowcount не подойдет Т.к. все-таки решить поставленную задачу? как получить максимальный номер клиента и увеличить на 1? и главное как подцепить хранимую процедуру - чтобы автоматически подставляла нужное значение? с уважением ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 09:52:25 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Если сервер 2000 то можно написать функцию на T-SQL которая вернёт нужную вам строку и прописать ее в качестве default value для нужного Вам поля в таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 10:13:10 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Хотя я и не понимаю зачем вам нужны такие ключи, но IMHO лучшим способом для вас будет создать дополнительную таблицу для хранения последнего добавленного ID. А все добавления делать в транзакции с эксклюзивной блокировкой этой таблицы. Тогда в триггере на добавление просто извлекаете из дополнительной таблицы значение ключа и делеаете с ним все, что захотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 10:28:35 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Вот туповато конечно ,но помоему твою проблему решает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 10:52:50 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
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 строка... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 11:05:53 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Большое спасибо ALL Вопрос получился глупый (больше теоретический )- для изучения основ TSQL Решил юзать через IDENTITY Но как использовать инструментарий - все таки думаю надо знать Ответ на вопрос все-таки получил!!! Спасибо за ответы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 12:13:58 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Можно обойтись и без функции для default value: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 12:42:33 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
У меня получилось так 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') ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 14:31:30 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Развивая идею возник еще вопрос Теперь хочу создать юзер функцию на сервере - в которой будет расчет счетчика но хотелось бы сделать функцию универсальной чтобы туда передавать название ключа, название таблицы, длину ключа написал такой "шедевр" :-( Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Понятно - не работает (и на сколько я понял и не должно) Может подскажет кто сведующий как решить такую задачу С уважением ЗЫ Сильно не ругайтесь - новичек я... изучаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 15:17:18 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Слышал (читал или видел) где-то, что сервер все равно создает свой собственный уникальный индекс (столбец), даже если он явно не указан в таблице, поэтому не морочься - используй числовой ID, а для "красивого" представления в виде "0001" используй преобразование в строку (ну и можешь хранить этот дополнительный строковый столбец, если очень захочешь). Извиняюсь, что на ты, ничего личного! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 17:40:23 |
|
||
|
Помогите новичку - автоикримент поля
|
|||
|---|---|---|---|
|
#18+
Полностью согласен с ТиБиБи. "Красивое" представление четырехзначного int - Код: plaintext 1. 2. 3. Тестировано на семерке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.07.2002, 23:49:32 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32038990&tid=1821532]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
50ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 360ms |

| 0 / 0 |
