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

Откуда:
Сообщений: 1497
Здравствуйте.
Есть такая проблема: нужно делать копию таблицы с автоинкрементным ключом, для того, чтобы во время расчетов только что посчитанные данные туда сливать и потом уже использовать.

Как можно создать копию структуры таблицы, не перечисляя все её поля, но только чтобы в результирующей таблице ключевое поле не было автоинкрементным?

Пока приходится делать так:

SELECT CAST(keyP AS int) AS keyP, keyDZ, DatPlat 
INTO #MP2 
FROM MP2 WHERE 1=2


А хотелось бы вот так:
SELECT *
INTO #MP2 
FROM MP2 WHERE 1=2

Но при таком создании таблицы у неё поле keyP - счетчик, и выполнить такое заполнение уже невозможно:
INSERT INTO #MP2
SELECT * FROM MP2


Есть ли выход из этой ситуации?
30 апр 14, 15:19    [15959175]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Crimean
Member

Откуда:
Сообщений: 13147
cast действительно помогает. а если без него то "set identity_insert #mp2 on" вам в руки же
30 апр 14, 15:21    [15959194]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Диам
поле keyP - счетчик, и выполнить такое заполнение уже невозможно:
Есть ли выход из этой ситуации?


SET IDENTITY_INSERT
30 апр 14, 15:21    [15959197]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
при такой постановке задачи, нет.
30 апр 14, 15:22    [15959200]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Crimean
cast действительно помогает


да там не только каст помогает...любые вычисления тоже, например

SELECT keyP+0 AS keyP, keyDZ, DatPlat 
INTO #MP2 
FROM MP2 WHERE 1=2
30 апр 14, 15:23    [15959209]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Диам
Member

Откуда:
Сообщений: 1497
Суть в том, что мне надо избавиться от перечисления всех полей. А cast() требует перечисления.
Также при спользовании IDENTITY_INSERT надо тоже явно указывать столбец. Вот сообщение об ошибке:
"Значение столбца идентификаторов в таблице "#Mp2" может указываться явно только при использовании списка столбцов и когда IDENTITY_INSERT установлен в ON."


Я пробовал добавлять доп.поле, а потом удалять поле с инкрементом и пытаться переименовать это доп.поле. Но ничего не вышло :(


Какие еще есть варианты?
30 апр 14, 15:39    [15959344]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
не?
Guest
select *
into #t
from t
where 1=0

alter table #t
drop column a

create table #e(a int)

select #e.a,#t.*
into #t2
from #t
cross join #e

insert into #t2
select * from t

select *
from #t2
30 апр 14, 15:46    [15959395]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
не?
Guest
не?,т.е.

create table mp2(a int identity,b int)
insert into mp2(b)
values (2),(1)

select *
into #t
from mp2
where 1=0

alter table #t
drop column a

create table #e(a int)

select #e.a,#t.*
into #mp2
from #t
cross join #e

insert into #mp2
select * from mp2

select *
from #mp2
30 апр 14, 15:54    [15959449]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Диам
Member

Откуда:
Сообщений: 1497
не?,
ОНО!!!! :) Спасибо большое. Замечательное решение :)
30 апр 14, 15:56    [15959466]     Ответить | Цитировать Сообщить модератору
 Re: Сделать копию структуры таблицы во временную, но без автоинкремента  [new]
Диам
Member

Откуда:
Сообщений: 1497
чуть более изящное решение, без использования таблицы #e:
SELECT * INTO #Mp
FROM MP2 WHERE 1=2

ALTER TABLE #MP DROP COLUMN keyP

SELECT CAST(0 AS int) as keyP, #Mp.*
INTO #MP2 FROM #Mp
DROP TABLE #Mp

INSERT INTO #Mp2
SELECT TOP (100) *
FROM MP2

--SELECT * FROM #MP2

DROP TABLE #Mp2
30 апр 14, 16:02    [15959513]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить