2015-06-02 2 views
4

Я пытаюсь скопировать запись из TableA обратно в TableA, но с использованием новой Identity. Я не хочу указывать список столбцов, так как у меня более 100 столбцов, и может быть больше в будущем. Id как кусок кода, который может запускаться, когда/если что-то меняется.SQL-копирование записи без указания списка столбцов; игнорируя Identity

Посмотрев на подобные вопросы, я пытался этот код

SELECT * INTO #tmp FROM TableA WHERE Id = 1; 
    ALTER TABLE #tmp DROP COLUMN Id; 
    INSERT INTO TableA SELECT * FROM #tmp; 
    Drop Table #tmp; 

Однако я все еще получаю эту ошибку

An explicit value for the identity column in table 'dbo.TableA' can only be specified when a column list is used and IDENTITY_INSERT is ON. 

Забегая Select * FROM #tmp дает мне то, что я хотел бы ожидать. Единственная запись со всеми моими столбцами, за исключением столбца Id.

Любые идеи?

Спасибо!

EDIT Вот такая картина свойств колонны Id

enter image description here

+0

Я полагаю, вы найдете ответ на свой вопрос здесь: http://stackoverflow.com/a/2005449/3044080 – nomistic

+0

я уже смотрел на эту страницу. Я не пытаюсь сделать Identity Insert. Мне все равно хотелось бы, чтобы столбец Id автоматически генерировал следующий номер. – user2684037

+0

Вы уверены, что 'Id' является, по сути, столбцом Identity для этой таблицы? –

ответ

4

Использование динамического SQL: получить список столбцов (за исключением ID), построить оператор вставки с помощью этого списка, а затем называют exec на нем:

SELECT * 
    INTO #tmp 
    FROM TableA 
    WHERE Id = 1; 
ALTER TABLE #tmp DROP COLUMN id; 

DECLARE @cols varchar(max); 

SELECT 
    @cols = COALESCE(@cols + ',', '') + COLUMN_NAME 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = 'TableA' AND COLUMN_NAME <> 'id' 

--select @cols -- display column list for debugging 
DECLARE @sqltxt varchar(max) = 'INSERT INTO TableA (' + @cols + ') SELECT * FROM #tmp'; 

--SELECT @sqltxt -- display the statement for debugging 

exec (@sqltxt) 

DROP TABLE #tmp 
+0

СПАСИБО! Интересно, я думаю, что мой вопрос, возможно, связан с тем фактом, что у меня есть 2 вычисленных столбца (о которых я забыл). Тонкая настройка для удаления вычисленных столбцов из вставки сделала работу красиво! Это действительно дало мне полезную ошибку, говоря мне, что я вычислил столбцы. – user2684037

+0

@ Kritner, Если я не понимаю вас, это не должно быть хорошо. Мы не создаем временную таблицу с динамическим SQL, просто читая ее. Если мы создали его с динамическим SQL, который может вызвать проблемы (я думаю). Во всяком случае, я тестировал это, и он работает. –

1

Try This

Шаг 1:

INSERT INTO Employee1(FirstName,LastName,ManagerID,Salary) 
    SELECT FirstName,LastName,ManagerID,Salary 
    FROM Employee1 
    WHERE EmployeeID=X -- Your Emplyee ID 

Шаг 2:

DELETE FROM Employee1 WHERE EmployeeID=X 
Смежные вопросы