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


IIRC, команда INSERT INTO использует схему исходной таблицы для создания временной таблицы. Это одна из причин, по которой вы не можете просто попытаться создать таблицу с дополнительным столбцом. Столбцы удостоверений внутренне привязаны к конструкции SQL Server, называемой генератором.
О маловерные:
SELECT *, IDENTITY( int ) AS idcol
INTO #newtable
FROM oldtable
http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx
Но, конечно, двух не может быть. Просто не выбирайте идентификатор col как часть запроса
Необходимо соблюдать осторожность, если вы используете предложение ORDER BY и ожидаете, что "idcol" будет в том же порядке. support.microsoft.com/kb/273586
выберите cast (CurrentID as int) в качестве CurrentID, вам это должно понравиться, если oldtable имеет столбец идентификаторов
Вы можете сделать Select Into, который на лету создаст структуру таблицы на основе выбранных вами полей, но я не думаю, что это создаст для вас поле идентификации.
Чтобы сделать вещи эффективными, вам нужно объявить, что один из столбцов является первичным ключом:
ALTER TABLE #mytable
ADD PRIMARY KEY(KeyColumn)
Это не будет принимать переменную для имени столбца.
Поверьте мне, вам НАМНОГО лучше сделать: CREATE #myTable TABLE (или, возможно, DECLARE TABLE @myTable), который позволяет вам напрямую устанавливать IDENTITY и PRIMARY KEY.
По-разному; вставки в индексированную таблицу (за некоторыми исключениями) медленнее, чем в неиндексированной таблице из-за обслуживания дерева B +; у этого приложения может не быть достаточно данных, загруженных во временную таблицу, чтобы индекс имел смысл. Полностью зависит от ситуации, и у нас недостаточно информации, чтобы знать
Он хочет «идентичности», чтобы «делать вещи эффективными». Мы можем сделать вывод, что он хотел бы получить доступ к элементам по идентификатору, который еще не существует. Легко отсортировать по идентификатору, которого еще нет.
он не определил эффективность - я подумал, что ему нужна идентичность не для скорости, а для простоты использования. Но если это связано с производительностью, просто проиндексируйте один из существующих столбцов
Вы прокомментировали: не работает, если в 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
Хороший вопрос и Мэтт был хорошим ответом. Чтобы немного расширить синтаксис, если старая таблица имеет идентификатор, пользователь может выполнить следующее:
SELECT col1, col2, IDENTITY( int ) AS idcol
INTO #newtable
FROM oldtable
Это было бы, если бы старая таблица была написана как-то так:
CREATE TABLE [dbo].[oldtable]
(
[oldtableID] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
[col1] [nvarchar](50) NULL,
[col2] [numeric](18, 0) NULL,
)
Если вы хотите включить столбец, который является текущим идентификатором, вы все равно можете это сделать, но вам нужно явно указать столбцы и преобразовать текущее удостоверение в int (при условии, что он сейчас один), например:
select cast (CurrentID as int) as CurrentID, SomeOtherField, identity(int) as TempID
into #temp
from myserver.dbo.mytable
Если после * вы укажете псевдоним столбца id, который нарушает запрос во второй раз ... и дадите ему новое имя ... он волшебным образом начнет работать.
select IDENTITY( int ) as TempID, *, SectionID as Fix2IDs
into #TempSections
from Files_Sections
Столбцы IDENTITY обеспечивают согласованность действий нескольких пользователей. ПЕРВИЧНЫЙ КЛЮЧ делает вещи эффективными. Используйте оба для максимального эффекта.