OVH Cloud OVH Cloud

Duplication d'un enregistrement

5 réponses
Avatar
Pierre-Yves
Bonjour,

je voudrais faire une procédure stockée pour dupliquer un enregistrement
d'une table en changeant simplement son code

Je vais donc passer en paramètre le code à remplacer.

En fait je souhaite éviter de mentionner tous les champs 1 à 1 dans une
instruction insert into

merci pour vos réponses

5 réponses

Avatar
Fred BROUARD
Si ce code n'est pas la clef :

INSERT INTO TableDest
SELECT *
FROM TableSource
WHERE ...

UPDATE TabeDest
SET Code = ...

Si besoin est de récupérer la clef auto inc, alors :

UPDATE TabeDest
SET Code = ...
WHERE LaClef = @@IDENTITY

Sinon, se tapper les colonnes à la main...

PS une petite fonction pour avoir toutes les colonnes d'une table :

CREATE FUNCTION FN_LISTE_COLS (@TABLE_NAME VARCHAR(128))
RETURNS VARCHAR(8000)
AS

BEGIN

-- liste des noms de colonnes dans
DECLARE @ColumnList VARCHAR(8000)
SET @ColumnList = ''

-- obtention de la liste des colonnes pour la requête de recherche
SELECT @ColumnList = @ColumnList + COLUMN_NAME +', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TABLE_NAME

RETURN SUBSTRING(@ColumnList, 1, LEN(@ColumnList) -1)

END
GO

A +

Pierre-Yves a écrit:
Bonjour,

je voudrais faire une procédure stockée pour dupliquer un enregistrement
d'une table en changeant simplement son code

Je vais donc passer en paramètre le code à remplacer.

En fait je souhaite éviter de mentionner tous les champs 1 à 1 dans une
instruction insert into

merci pour vos réponses





--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************
Avatar
Pierre-Yves
En fait, je veux dupliquer l' enregistrement dans la meme table en changeant
le code qui est la clé primaire

exemple de ce que je souhaiterais faire:
insert into table1
select @valeur2,* from table1
where champ=@valeur1

si je fais
insert into table1
select * from table1
where champ =@valeur1

j'insère un doublon dans ma table

merci pour l'astuce








"Fred BROUARD" a écrit dans le message de
news:
Si ce code n'est pas la clef :

INSERT INTO TableDest
SELECT *
FROM TableSource
WHERE ...

UPDATE TabeDest
SET Code = ...

Si besoin est de récupérer la clef auto inc, alors :

UPDATE TabeDest
SET Code = ...
WHERE LaClef = @@IDENTITY

Sinon, se tapper les colonnes à la main...

PS une petite fonction pour avoir toutes les colonnes d'une table :

CREATE FUNCTION FN_LISTE_COLS (@TABLE_NAME VARCHAR(128))
RETURNS VARCHAR(8000)
AS

BEGIN

-- liste des noms de colonnes dans
DECLARE @ColumnList VARCHAR(8000)
SET @ColumnList = ''

-- obtention de la liste des colonnes pour la requête de recherche
SELECT @ColumnList = @ColumnList + COLUMN_NAME +', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TABLE_NAME

RETURN SUBSTRING(@ColumnList, 1, LEN(@ColumnList) -1)

END
GO

A +

Pierre-Yves a écrit:
> Bonjour,
>
> je voudrais faire une procédure stockée pour dupliquer un enregistrement
> d'une table en changeant simplement son code
>
> Je vais donc passer en paramètre le code à remplacer.
>
> En fait je souhaite éviter de mentionner tous les champs 1 à 1 dans une
> instruction insert into
>
> merci pour vos réponses
>
>

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



Avatar
Pierre-Yves
En fait, je veux dupliquer l' enregistrement dans la meme table en changeant
le code qui est la clé primaire

exemple de ce que je souhaiterais faire:
insert into table1
select @valeur2,* from table1
where champ=@valeur1

si je fais
insert into table1
select * from table1
where champ =@valeur1

j'insère un doublon dans ma table

merci pour l'astuce








"Fred BROUARD" a écrit dans le message de
news:
Si ce code n'est pas la clef :

INSERT INTO TableDest
SELECT *
FROM TableSource
WHERE ...

UPDATE TabeDest
SET Code = ...

Si besoin est de récupérer la clef auto inc, alors :

UPDATE TabeDest
SET Code = ...
WHERE LaClef = @@IDENTITY

Sinon, se tapper les colonnes à la main...

PS une petite fonction pour avoir toutes les colonnes d'une table :

CREATE FUNCTION FN_LISTE_COLS (@TABLE_NAME VARCHAR(128))
RETURNS VARCHAR(8000)
AS

BEGIN

-- liste des noms de colonnes dans
DECLARE @ColumnList VARCHAR(8000)
SET @ColumnList = ''

-- obtention de la liste des colonnes pour la requête de recherche
SELECT @ColumnList = @ColumnList + COLUMN_NAME +', '
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = @TABLE_NAME

RETURN SUBSTRING(@ColumnList, 1, LEN(@ColumnList) -1)

END
GO

A +

Pierre-Yves a écrit:
> Bonjour,
>
> je voudrais faire une procédure stockée pour dupliquer un enregistrement
> d'une table en changeant simplement son code
>
> Je vais donc passer en paramètre le code à remplacer.
>
> En fait je souhaite éviter de mentionner tous les champs 1 à 1 dans une
> instruction insert into
>
> merci pour vos réponses
>
>

--
Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
************************ www.datasapiens.com *************************



Avatar
Laurent Moreau
Si tu n'as pas de champ Identity dans ta table, tu peux faire ainsi:

SELECT * INTO #Tmp FROM table1 where champ=@valeur1
UPDATE #Tmp SET champ=@valeur2
INSERT INTO table1 SELECT * FROM #Tmp



Laurent.




"Pierre-Yves" wrote in message
news:
En fait, je veux dupliquer l' enregistrement dans la meme table en


changeant
le code qui est la clé primaire

exemple de ce que je souhaiterais faire:
insert into table1
select @valeur2,* from table1
where champ=@valeur1

si je fais
insert into table1
select * from table1
where champ =@valeur1

j'insère un doublon dans ma table

merci pour l'astuce








"Fred BROUARD" a écrit dans le message de
news:
> Si ce code n'est pas la clef :
>
> INSERT INTO TableDest
> SELECT *
> FROM TableSource
> WHERE ...
>
> UPDATE TabeDest
> SET Code = ...
>
> Si besoin est de récupérer la clef auto inc, alors :
>
> UPDATE TabeDest
> SET Code = ...
> WHERE LaClef = @@IDENTITY
>
> Sinon, se tapper les colonnes à la main...
>
> PS une petite fonction pour avoir toutes les colonnes d'une table :
>
> CREATE FUNCTION FN_LISTE_COLS (@TABLE_NAME VARCHAR(128))
> RETURNS VARCHAR(8000)
> AS
>
> BEGIN
>
> -- liste des noms de colonnes dans
> DECLARE @ColumnList VARCHAR(8000)
> SET @ColumnList = ''
>
> -- obtention de la liste des colonnes pour la requête de recherche
> SELECT @ColumnList = @ColumnList + COLUMN_NAME +', '
> FROM INFORMATION_SCHEMA.COLUMNS
> WHERE TABLE_NAME = @TABLE_NAME
>
> RETURN SUBSTRING(@ColumnList, 1, LEN(@ColumnList) -1)
>
> END
> GO
>
> A +
>
> Pierre-Yves a écrit:
> > Bonjour,
> >
> > je voudrais faire une procédure stockée pour dupliquer un


enregistrement
> > d'une table en changeant simplement son code
> >
> > Je vais donc passer en paramètre le code à remplacer.
> >
> > En fait je souhaite éviter de mentionner tous les champs 1 à 1 dans


une
> > instruction insert into
> >
> > merci pour vos réponses
> >
> >
>
> --
> Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ************************ www.datasapiens.com *************************
>




Avatar
Laurent Moreau
Si tu n'as pas de champ Identity dans ta table, tu peux faire ainsi:

SELECT * INTO #Tmp FROM table1 where champ=@valeur1
UPDATE #Tmp SET champ=@valeur2
INSERT INTO table1 SELECT * FROM #Tmp



Laurent.




"Pierre-Yves" wrote in message
news:
En fait, je veux dupliquer l' enregistrement dans la meme table en


changeant
le code qui est la clé primaire

exemple de ce que je souhaiterais faire:
insert into table1
select @valeur2,* from table1
where champ=@valeur1

si je fais
insert into table1
select * from table1
where champ =@valeur1

j'insère un doublon dans ma table

merci pour l'astuce








"Fred BROUARD" a écrit dans le message de
news:
> Si ce code n'est pas la clef :
>
> INSERT INTO TableDest
> SELECT *
> FROM TableSource
> WHERE ...
>
> UPDATE TabeDest
> SET Code = ...
>
> Si besoin est de récupérer la clef auto inc, alors :
>
> UPDATE TabeDest
> SET Code = ...
> WHERE LaClef = @@IDENTITY
>
> Sinon, se tapper les colonnes à la main...
>
> PS une petite fonction pour avoir toutes les colonnes d'une table :
>
> CREATE FUNCTION FN_LISTE_COLS (@TABLE_NAME VARCHAR(128))
> RETURNS VARCHAR(8000)
> AS
>
> BEGIN
>
> -- liste des noms de colonnes dans
> DECLARE @ColumnList VARCHAR(8000)
> SET @ColumnList = ''
>
> -- obtention de la liste des colonnes pour la requête de recherche
> SELECT @ColumnList = @ColumnList + COLUMN_NAME +', '
> FROM INFORMATION_SCHEMA.COLUMNS
> WHERE TABLE_NAME = @TABLE_NAME
>
> RETURN SUBSTRING(@ColumnList, 1, LEN(@ColumnList) -1)
>
> END
> GO
>
> A +
>
> Pierre-Yves a écrit:
> > Bonjour,
> >
> > je voudrais faire une procédure stockée pour dupliquer un


enregistrement
> > d'une table en changeant simplement son code
> >
> > Je vais donc passer en paramètre le code à remplacer.
> >
> > En fait je souhaite éviter de mentionner tous les champs 1 à 1 dans


une
> > instruction insert into
> >
> > merci pour vos réponses
> >
> >
>
> --
> Frédéric BROUARD, MVP SQL Server. Expert SQL / spécialiste Delphi, web
> Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
> Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
> ************************ www.datasapiens.com *************************
>