Скопировать строку в той же таблице - PullRequest
8 голосов
/ 22 июня 2011

С учетом следующего SQL (MS SQL 2008):

SET IDENTITY_INSERT MyTable ON
GO
INSERT INTO MyTable
  SELECT * FROM MyTable
  WHERE Id = @SomeId
GO
SET IDENTITY_INSERT MyTable OFF

Это приводит к: An explicit value for the identity column in table 'MyTable' can only be specified when a column list is used and IDENTITY_INSERT is ON.

Ну, мне действительно нужно определить список столбцов? Нет ли способа сделать его общим? Например. если разработчик добавит столбец позже, этот столбец не будет включен в эту подпрограмму, и даже потерпит неудачу, если ноль не разрешен ...

Ответы [ 4 ]

26 голосов
/ 22 июня 2011

Ну, на самом деле есть более общий способ, он хорошо работает без знания столбцов:

DECLARE @Tablename NVARCHAR(255) = 'MyTable'
DECLARE @IdColumn NVARCHAR(255) = 'MyTableId'  -- Primarykey-Column, will be ignored
DECLARE @IdToCopyFrom VARCHAR(255) = '33'  -- Copy from this ID

DECLARE @ColName NVARCHAR(255)
DECLARE @SQL NVARCHAR(MAX) = ''

DECLARE Table_Cursor CURSOR FOR
SELECT [B].[Name]
FROM SYSOBJECTS AS [A], SYSCOLUMNS AS [B]
WHERE [A].[ID] = [B].[ID] AND A.name = @Tablename

OPEN Table_Cursor
FETCH NEXT FROM Table_Cursor INTO @ColName 
WHILE (@@FETCH_STATUS = 0)
BEGIN
    -- Loop through all columns and link them into the Sql-string (except the PK-column)
    DECLARE @SkipComma BIT = 0
    IF (@ColName <> @IdColumn)
        SET @SQL = @SQL + @ColName
    ELSE
        SET @SkipComma = 1
    FETCH NEXT FROM Table_Cursor INTO @ColName 
    IF (@SkipComma = 0 AND @@FETCH_STATUS = 0)
        SET @SQL = @SQL + ','
    END
CLOSE Table_Cursor
DEALLOCATE Table_Cursor 

SET @SQL = 'INSERT INTO ' + @Tablename + '(' + @SQL + ')' +
    ' SELECT ' + @SQL + ' FROM ' + @Tablename +
    ' WHERE ' + @IdColumn + ' = ' + @IdToCopyFrom
PRINT @SQL
EXEC(@SQL)

Ура! * * 1004

16 голосов
/ 22 июня 2011

Я не пользователь MS-SQL, но во всех других базах данных, с которыми я работал, я никогда не видел способа, который бы включал в себя не перечисление всех столбцов вручную, а автоматическое увеличение.

insert into mytable (some, columns, but, not, the, id) 
    select some, columns, but, not, the, id from mytable where id = someid
2 голосов
/ 22 июня 2011
  1. Вам нужен список столбцов
  2. Зачем вставлять то же значение снова?
0 голосов
/ 14 июля 2012

Большая помощь - использование автоматического создателя сценариев в SQL-Manager:

В моем случае более 60 столбцов, и каждый из них написать очень сложно. Итак, щелкните правой кнопкой мыши на столе и выберите: «Таблица сценариев как» -> «Выбрать» -> «Окно нового запроса»

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...