Подтвердить что ты не робот

В MS-SQL, как сделать INSERT INTO в таблице temp и создать поле IDENTITY без предварительного объявления таблицы temp?

Мне нужно выбрать кучу данных в таблице temp, чтобы затем выполнить некоторые вторичные вычисления; Чтобы сделать работу более эффективной, я хотел бы иметь столбец IDENTITY в этой таблице. Я знаю, что сначала могу объявить таблицу идентификатором, а затем вставить в нее остальные данные, но есть ли способ сделать это за один шаг?

4b9b3361

Ответ 2

Вы прокомментировали: не работает, если oldtable имеет столбец идентификаторов.

Я думаю, что ваш ответ. #newtable автоматически получает столбец идентификатора из oldtable. Запустите следующие утверждения:

create table oldtable (id int not null identity(1,1), v varchar(10) )

select * into #newtable from oldtable

use tempdb
GO
sp_help #newtable

Он показывает вам, что #newtable имеет столбец идентификаторов.

Если вам не нужен столбец идентификатора, попробуйте это при создании #newtable:

select id + 1 - 1 as nid, v, IDENTITY( int ) as id into #newtable
     from oldtable

Ответ 3

Если вы хотите включить столбец, который является текущим идентификатором, вы все равно можете это сделать, но вы должны явно перечислить столбцы и передать текущую идентификацию в int (предположим, что это сейчас), например:

select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID 
into #temp
from myserver.dbo.mytable

Ответ 4

Чтобы сделать вещи эффективными, вам нужно объявить, что один из столбцов является первичным ключом:

ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)

Это не будет принимать переменную для имени столбца.

Поверьте мне, вам намного лучше сделать: CREATE #myTable TABLE (или, возможно, DECLARE TABLE @myTable), который позволяет вам напрямую устанавливать идентификатор и PRIMARY KEY.

Ответ 5

Хороший вопрос и Мэтт были хорошим ответом. Чтобы немного расширить синтаксис, если oldtable имеет идентификатор, пользователь может запустить следующее:
SELECT col1, col2, IDENTITY( int ) AS idcol

  INTO #newtable

  FROM oldtable

-

Это было бы, если бы в oldtable было написано что-то вроде:

CREATE TABLE [dbo].[oldtable]
(
    [oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    [col1] [nvarchar](50) NULL,
    [col2] [numeric](18, 0) NULL,
)

спасибо 4 эта информация помогла мне,

Катто

Ответ 6

Если после * вы вышлем псевдоним, который нарушает запрос во второй раз... и дайте ему новое имя... он волшебным образом начинает работать.

Выберите IDENTITY (int) AS TempID, *, SectionID как Fix2IDs в #TempSections из Files_Sections

Ответ 7

Вы можете сделать Select Into, который будет создавать структуру таблицы "на лету" на основе выбранных вами полей, но я не думаю, что создаст для вас поле идентификации.

Ответ 8

IIRC, команда INSERT INTO использует схему исходной таблицы для создания таблицы temp. В этой причине вы не можете просто попытаться создать таблицу с дополнительным столбцом. Столбцы идентичности внутренне привязаны к конструкции SQL Server, называемой генератором.