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


36

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

+1

IDENTITY колонны делают вещи последовательной для нескольких пользователей. ПЕРВЫЕ КЛЮЧИ делают вещи эффективными. Используйте оба для максимального эффекта. 23 сен. 082008-09-23 20:28:18

64

О вы, маловеры:

SELECT *, IDENTITY(int) AS idcol 
    INTO #newtable 
    FROM oldtable 

http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx

  0

Не работает, если oldtable имеет идентификационный столбец 23 сен. 082008-09-23 20:38:39

+1

Но, конечно, у вас не может быть двух. Просто не выбирайте идентификатор col как часть запроса 23 сен. 082008-09-23 20:54:24

  0

Нужно быть осторожным при использовании предложения ORDER BY и ожидать, что «idcol» будет в том же порядке. http://support.microsoft.com/kb/273586 04 окт. 112011-10-04 18:28:36

  0

выберите cast (CurrentID as int) как CurrentID, вам нужно это сделать, если oldtable имеет столбец идентификатора 05 фев. 142014-02-05 17:58:29


-4

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


-3

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


1

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

ALTER TABLE #mytable 
ADD PRIMARY KEY(KeyColumn) 

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

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

  0

Это зависит; вставки в индексированную таблицу (за небольшим исключением) медленнее, чем неиндексированная таблица из-за обслуживания дерева B +; это приложение может не иметь достаточных данных, загруженных в таблицу temp, чтобы сделать индекс стоящим. Полностью зависит от ситуации, и у нас недостаточно информации, чтобы знать 23 сен. 082008-09-23 20:58:20

  0

Он хочет, чтобы «личность» «делала вещи эффективными». Мы можем заключить, что он хотел бы получить доступ к элементам по идентификатору, который еще не существует. Легко сортировать по id, который еще не существует. 23 сен. 082008-09-23 21:53:05

  0

он не определил эффективность - я думал, что он хотел, чтобы личность не для скорости, а для простоты использования. Но если это производительность, просто проиндексируйте один из существующих столбцов 23 сен. 082008-09-23 23:19:48


5

Вы прокомментировали: не работает, если 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 

1

Хороший вопрос & Мэтт был хороший ответ.Для расширения синтаксиса немного, если 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, 
) 

Thx 4 инфо этот вопрос помог мне,

Катто


2

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

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

, это работает на меня. благодаря 05 фев. 142014-02-05 17:57:34


0

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

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