Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Товарищи, подскажите как решить следующую проблему.
Необходимо создать многопроходный скрипт, т.е. такой скрипт, который, сколько бы раз я его не выполнял, он все равно выполнится и, в данном, случае заполнит таблицу одинаковыми данными.
проблема возникает с автоинкрементным полем, которое объявлено как:
CREATE TABLE [dbo].[USER](
[USER_ID] [int] IDENTITY(1,1),
[USER_NM] varchar(30))


скрипт:
DELETE FROM [dbo].[USER];
PRINT ident_current('[USER]');
DBCC CHECKIDENT ([USER], RESEED, 0);
INSERT [dbo].[USER] ([USER_NM]) VALUES ('VIvanov');


в результате чего при первом прогоне автоинкремент заполняется с 0, а все последующие заполнения с 1.
при этом функция ident_current('[USER]') выводит при первом прогоне 1, а функция DBCC CHECKIDENT ([USER], RESEED, 0) выводит null.
С чем это связано и как побороть?
5 дек 13, 11:16    [15244510]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
Glory
Member

Откуда:
Сообщений: 104760
DELETE FROM [dbo].[USER]; -->> TRUNCATE TABLE [dbo].[USER];
5 дек 13, 11:19    [15244537]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Glory,
Во-первых мне такой вариант не подойдет, т.к. есть внешние ключи.
Во-вторых, каким образом это решает проблему с автоинкрементом?
5 дек 13, 11:24    [15244584]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
Glory
Member

Откуда:
Сообщений: 104760
FRoST86
Во-первых мне такой вариант не подойдет, т.к. есть внешние ключи.

Начинается
FRoST86
Во-вторых, каким образом это решает проблему с автоинкрементом?

BOL - TRUNCATE
If the table contains an identity column, the counter for that column is reset to the seed value defined for the column. If no seed was defined, the default value 1 is used. To retain the identity counter, use DELETE instead.
5 дек 13, 11:26    [15244612]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Glory
Начинается

Каким образом поступить, если есть внешние ключи?
5 дек 13, 11:30    [15244648]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
Glory
Member

Откуда:
Сообщений: 104760
FRoST86
Каким образом поступить, если есть внешние ключи?

DBCC CHECKIDENT
5 дек 13, 11:31    [15244666]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Glory
DBCC CHECKIDENT

так я его и использую, но результат не удовлетворительный.
5 дек 13, 11:35    [15244706]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
Glory
Member

Откуда:
Сообщений: 104760
FRoST86
так я его и использую, но результат не удовлетворительный.

Неправильный - это какой ?
Значения в таблице разве не начинаются с 1цы всегда ?
5 дек 13, 11:38    [15244747]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Glory
FRoST86
так я его и использую, но результат не удовлетворительный.

Неправильный - это какой ?
Значения в таблице разве не начинаются с 1цы всегда ?

нет, при первом проходе заполняется с 0.
наверное это происходит из за того, что при первом использовании автоинкремента берется seed, ,без добавления шага, а он, не смотря на то, что объявлен как identity(1,1) сбрасывается в 0 функцией DBCC CHECKIDENT ([USER], RESEED, 0).
может каким нибудь образом возможно определить отработал автоинкремент или нет, или явно задать, что будет делаться первый шаг (без добавления step).
5 дек 13, 11:46    [15244852]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
Glory
Member

Откуда:
Сообщений: 104760
SET IDENTITY_INSERT ...
INSERT [dbo].[USER] (ID, [USER_NM]) VALUES (1, 'VIvanov');
5 дек 13, 11:48    [15244874]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
FRoST86
Member

Откуда:
Сообщений: 121
Glory
SET IDENTITY_INSERT ...
INSERT [dbo].[USER] (ID, [USER_NM]) VALUES (1, 'VIvanov');

т.е. вы предлагаете явно вставить по одной строке в каждую таблицу, а затем их удалить?
я таким образом и сделал, но предполагал, что есть какой нибудь более "красивый" способ.
Спасибо!
5 дек 13, 11:54    [15244931]     Ответить | Цитировать Сообщить модератору
 Re: многопроходный DML скрипт для таблицы с автоинкрементным полем  [new]
Glory
Member

Откуда:
Сообщений: 104760
FRoST86
т.е. вы предлагаете явно вставить по одной строке в каждую таблицу, а затем их удалить?

Нет. Я предлагаю отказаться от
PRINT ident_current('[USER]');
DBCC CHECKIDENT ([USER], RESEED, 0);
и заполнять таблицу явными значениями
5 дек 13, 12:00    [15245003]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить