2010-10-19 5 views
4

A) Ma façon à ce jour:Comment puis-je copier une ligne dans une même table avec SQL Server 2008

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

B) je veux faire quelque chose comme ceci:

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

Note: I copie à la même table. Je veux simplement copier tout cela dans une autre ligne, tout en donnant à la nouvelle ligne un nouvel identifiant.

Est-ce une bonne pratique et possible ou non?

Répondre

5

La seule façon de faire est de lister toutes les colonnes comme dans votre premier exemple. Il n'y a pas de syntaxe comme SELECT *, -Id

Vous devez utiliser du SQL paramétré pour des raisons d'injection SQL et de mise en cache de plan.

5

J'ai eu le même problème moi-même et je voulais un moyen simple et agréable de le faire. J'ai trouvé une solution here qui permet cela. Je l'ai légèrement modifié pour supprimer l'ID de sortie et également pour que le IdColumnName ait une valeur par défaut de '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 

Exemple d'utilisation:

EXEC TableRowCopy 'MyTable', 3 
+0

Nice. Qu'en est-il de la solution de Martin? L'avez-vous essayé? Cela a fonctionné pour moi. – radbyx

+1

@radbyx: la solution de Martin nécessite que l'utilisateur entre tous les noms de colonne. –

+0

Oh d'accord. Je n'ai pas fait de DB récemment, mais je vais essayer de garder votre réponse à l'esprit. Merci. – radbyx

Questions connexes