Как я могу скопировать строку в ту же таблицу с SQL Server 2008 - PullRequest
4 голосов
/ 19 октября 2010

A) Мой путь пока:

sqlCommand.CommandText =
"INSERT Table1 ([column1],[column2],[column3])" +
            " SELECT [column1],[column2],[column3]" +
            " FROM Table1 WHERE Id =" + param +
            ";select scope_identity() as id";

B) Я хочу сделать что-то вроде этого:

INSERT INTO "table1" (* (without the ID-column))
SELECT (* (without the ID-column))
FROM "table1"

Примечание: я копирую в ту же таблицу.Я просто хочу просто скопировать все это в другую строку, в то время как, конечно, давая новой строке новый идентификатор.

Это хорошая практика и возможна или нет?

Ответы [ 2 ]

5 голосов
/ 12 апреля 2012

У меня была та же проблема, и я хотел хороший и простой способ сделать это.

Я нашел решение здесь , которое позволяет это.Я немного изменил его, чтобы удалить выходной идентификатор, а также чтобы в качестве значения по умолчанию для IdColumnName было указано «Id».

IF OBJECT_ID('TableRowCopy') IS NOT NULL DROP PROCEDURE TableRowCopy
GO
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[TableRowCopy](
    @TableName VARCHAR(50),
    @WhereIdValue INT,
    @IdColumnName VARCHAR(50) = 'Id'
)
AS
BEGIN
    DECLARE @columns VARCHAR(5000), @query VARCHAR(8000);
    SET @query = '' ;

    SELECT @columns =
        CASE
            WHEN @columns IS NULL THEN column_name
            ELSE @columns + ',' + column_name
        END
    FROM INFORMATION_SCHEMA.COLUMNS
    WHERE (
        TABLE_NAME = LTRIM(RTRIM(@TableName))
        AND
        column_name != LTRIM(RTRIM(@IdColumnName))
    );

    SET @query = 'INSERT INTO ' + @TableName + ' (' + @columns + ') SELECT ' + @columns + ' FROM ' + @TableName + ' WHERE ' + @IdColumnName + ' = ' + CAST(@WhereIdValue AS VARCHAR);
    EXEC (@query);
    SELECT SCOPE_IDENTITY();
END

Пример использования:

EXEC TableRowCopy 'MyTable', 3
5 голосов
/ 19 октября 2010

Единственный способ сделать это - перечислить все столбцы, как в первом примере. Там нет синтаксиса, как SELECT *, -Id

Вы должны использовать параметризованный SQL, хотя для внедрения SQL и планирования кэширования.

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