2016-10-22 1 views
1

Comment dupliquer table dans SQL Server (y compris PK & FK), je l'ai essayé ceci:Comment dupliquer table SQL Server (incluent PK et FK)

SELECT TOP 0 * INTO new_table FROM old_table 

mais il est ne fonctionne pas, il suffit de copier que columns sans Primary Key/Foreign Key

+2

Voir ce sujet: http://dba.stackexchange.com/questions/18059/copy-complete-structure-of-a-table – Shadow

Répondre

0

J'ai écrit un script dans mon environnement de travail à faire ce

cela va créer les objets suivants sur la nouvelle table basée sur la table existante

  1. DEFAULT Constraint
  2. contrainte de clé primaire
  3. UNIQUE Constraint
  4. contrainte de clé étrangère

Les tableaux créés à l'aide INTO clause ne pas avoir les objets ci-dessus créés dans le nouveau tableau

Script:

IF Object_id('TEMPDB..#TABLE_LIST') IS NOT NULL 
    DROP TABLE #TABLE_LIST 

CREATE TABLE #TABLE_LIST 
    (
     ORG_TABLE_NAME SYSNAME, 
     TEMP_TABLE_NAME SYSNAME 
    ) 

INSERT INTO #TABLE_LIST 
      (ORG_TABLE_NAME, 
       TEMP_TABLE_NAME) 
Values('old_table','new_table') 


-------------------------------------------------DEFAULT SCRIPT START--------------------------------------------------- 
DECLARE @DEFAULT_SCRIPT VARCHAR(MAX) ='' 

SET @DEFAULT_SCRIPT = (SELECT 'ALTER TABLE ['+SCHEMA_NAME(SCHEMA_ID)+'].['+TL.TEMP_TABLE_NAME+'] 
                 ADD CONSTRAINT ['+replace(DC.NAME,tl.ORG_TABLE_NAME,tl.TEMP_TABLE_NAME)+'] DEFAULT '+DEFINITION+' FOR ['+C.NAME+'] 

             ' 
FROM SYS.DEFAULT_CONSTRAINTS DC INNER JOIN SYS.COLUMNS C ON DC.PARENT_OBJECT_ID = C.OBJECT_ID 
AND DC.PARENT_COLUMN_ID = C.COLUMN_ID 
join #TABLE_LIST TL on OBJECT_ID(TL.ORG_TABLE_NAME) = PARENT_OBJECT_ID) 

--print @DEFAULT_SCRIPT 
EXEC (@DEFAULT_SCRIPT) 


-------------------------------------------------DEFAULT SCRIPT END--------------------------------------------------- 

-------------------------------------------------PRIMARY SCRIPT START--------------------------------------------------- 
DECLARE @PRIMARY_SCRIPT VARCHAR(MAX) ='' 

SET @PRIMARY_SCRIPT = (SELECT 'ALTER TABLE ['+TL.TEMP_TABLE_NAME+'] 
               ADD CONSTRAINT ['+replace(TAB.CONSTRAINT_NAME,tl.ORG_TABLE_NAME,tl.TEMP_TABLE_NAME) +'] PRIMARY KEY ('+LEFT(CS.COL_LIST, LEN(CS.COL_LIST) - 1)+') 

               ' 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TAB 
JOIN #TABLE_LIST TL on TL.ORG_TABLE_NAME = TAB.TABLE_NAME 
     CROSS APPLY (SELECT QUOTENAME(COLUMN_NAME) + ',' 
           FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE COL 
           WHERE COL.CONSTRAINT_NAME = TAB.CONSTRAINT_NAME 
              AND COL.TABLE_NAME = TAB.TABLE_NAME 
           FOR XML PATH('')) CS (COL_LIST) 
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY' 
GROUP BY TAB.TABLE_NAME, 
       TAB.CONSTRAINT_NAME, 
       CONSTRAINT_SCHEMA,tl.ORG_TABLE_NAME,tl.TEMP_TABLE_NAME, 
       LEFT(CS.COL_LIST, LEN(CS.COL_LIST) - 1)) 

--print @PRIMARY_SCRIPT 
EXEC (@PRIMARY_SCRIPT) 

-------------------------------------------------PRIMARY SCRIPT END--------------------------------------------------- 


-------------------------------------------------UNIQUE CONSTARINT SCRIPT START--------------------------------------------------- 
DECLARE @UNIQUE_SCRIPT VARCHAR(MAX) ='' 

SET @UNIQUE_SCRIPT = (SELECT 'ALTER TABLE ['+TL.TEMP_TABLE_NAME+'] 
               ADD CONSTRAINT ['+replace(TAB.CONSTRAINT_NAME,tl.ORG_TABLE_NAME,tl.TEMP_TABLE_NAME)+'] UNIQUE ('+LEFT(CS.COL_LIST, LEN(CS.COL_LIST) - 1)+') 

               ' 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS TAB 
     JOIN #TABLE_LIST TL on TL.ORG_TABLE_NAME = TAB.TABLE_NAME 
     CROSS APPLY (SELECT QUOTENAME(COLUMN_NAME) + ',' 
           FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE COL 
           WHERE COL.CONSTRAINT_NAME = TAB.CONSTRAINT_NAME 
              AND COL.TABLE_NAME = TAB.TABLE_NAME 
           FOR XML PATH('')) CS (COL_LIST) 
WHERE CONSTRAINT_TYPE = 'UNIQUE' 
GROUP BY TAB.TABLE_NAME, 
       TAB.CONSTRAINT_NAME, 
       CONSTRAINT_SCHEMA,tl.ORG_TABLE_NAME,tl.TEMP_TABLE_NAME, 
       LEFT(CS.COL_LIST, LEN(CS.COL_LIST) - 1)) 


EXEC (@UNIQUE_SCRIPT) 

-------------------------------------------------UNIQUE CONSTARINT SCRIPT END--------------------------------------------------- 

-------------------------------------------------FOREIGN KEY SCRIPT START--------------------------------------------------- 
DECLARE @FOREIGNKEY_SCRIPT VARCHAR(MAX) = '' 

SET @FOREIGNKEY_SCRIPT = (SELECT 'ALTER TABLE ['+TL.TEMP_TABLE_NAME+'] 
               ADD CONSTRAINT '+replace(F.NAME,tl.ORG_TABLE_NAME,tl.TEMP_TABLE_NAME)+' FOREIGN KEY('+QUOTENAME(COL_NAME(FC.PARENT_OBJECT_ID, FC.PARENT_COLUMN_ID))+') REFERENCES '+OBJECT_NAME (F.REFERENCED_OBJECT_ID)+'('+QUOTENAME(COL_NAME(FC.REFERENCED_OBJECT_ID, FC.REFERENCED_COLUMN_ID))+') 

               ' 
FROM SYS.FOREIGN_KEYS AS F 
     INNER JOIN SYS.FOREIGN_KEY_COLUMNS AS FC 
         ON F.OBJECT_ID = FC.CONSTRAINT_OBJECT_ID 
         INNER JOIN #TABLE_LIST TL on TL.ORG_TABLE_NAME = OBJECT_NAME(F.PARENT_OBJECT_ID)) 

EXEC (@FOREIGNKEY_SCRIPT) 

Note:

  1. Je ne géraient pas schema si le script estime qu'il n'y a que dbo schéma
  2. Si constraint n'est pas nécessaire, alors vous pouvez commenter ou supprimer de script.
+0

Quelqu'un peut-il expliquer la downvote:/ –

+2

Je ne l'ai pas downvote, mais la Le script suppose des conventions de dénomination de contrainte, des contraintes de vérification, des index, aucun schéma de groupe de fichiers/partition, etc. L'exécution de cette tâche dans T-SQL nécessite l'utilisation de vues de catalogue SQL Server à la place de INFORMATION_SCHEMA. En outre, la concaténation de chaînes agrégées n'est pas fiable; utilisez XML à la place. –

+0

@DanGuzman - Il est bon d'avoir les mêmes conventions de nommage que la table de base. Alors OP a demandé seulement 'PK' &' FK' mais j'ai simplement ajouté les autres contraintes. Mettra à jour ma réponse pour 'vérifier la contrainte' et' Index'. –