Мне нужно выбрать кучу данных в таблице temp, чтобы затем выполнить некоторые вторичные вычисления; Чтобы сделать работу более эффективной, я хотел бы иметь столбец IDENTITY в этой таблице. Я знаю, что сначала могу объявить таблицу идентификатором, а затем вставить в нее остальные данные, но есть ли способ сделать это за один шаг?
В MS-SQL, как сделать INSERT INTO в таблице temp и создать поле IDENTITY без предварительного объявления таблицы temp?
Ответ 1
О, немного веры:
SELECT *, IDENTITY( int ) AS idcol
INTO #newtable
FROM oldtable
http://msdn.microsoft.com/en-us/library/aa933208(SQL.80).aspx
Ответ 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, называемой генератором.