代码之家  ›  专栏  ›  技术社区  ›  radbyx Matt

如何使用SQL Server 2008将行复制到同一表中

  •  4
  • radbyx Matt  · 技术社区  · 14 年前

    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"
    

    注意:我正在复制到同一个表。我只想简单地将它复制到另一行,当然,还要给新行一个新的ID。

    2 回复  |  直到 14 年前
        1
  •  5
  •   Martin Smith    14 年前

    唯一的方法是像第一个例子那样列出所有列。没有像这样的语法 SELECT *, -Id

    但是,出于SQL注入和计划缓存的原因,应该使用参数化SQL。

        2
  •  5
  •   Dan Atkinson    11 年前

    我自己也有同样的问题,我想用一种简单的方法来解决这个问题。

    我找到了解决办法 here 这就允许了。我稍微修改了一下,删除了输出id,并使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