J'ai deux tables dans une base de données SQL Server. Je veux vérifier si ces deux tables sont structurellement identiques. J'ai utilisé l'opérateur UNION/ EXCEPT pour vérifier cela et j'ai trouvé que ces deux tables ne sont pas identiques.

Voici mes questions:

  1. Comment savoir si deux tables ont la même structure?

  2. S'ils ne sont pas les mêmes, comment obtenir les détails des différences? S'il manque une colonne dans une table, comment obtenir le nom de la colonne manquante?

  3. S'il existe une incompatibilité de type de données entre une colonne de ces deux tables, pouvons-nous obtenir le nom de la colonne avec un type de données différent?

1
StackHelp 17 nov. 2017 à 11:33

4 réponses

En utilisant sys.dm_exec_describe_first_result_set, vous pouvez obtenir des informations sur les colonnes dans la table / requête ... Dans cet exemple, vous pouvez voir comment faire une comparaison du nom de colonne, de la nullité, du type de données et de l'identité

SELECT DEV.name as DEV_ColumnName, 
PROD.name as PROD_ColumnName, 
DEV.is_nullable as DEV_is_nullable, 
PROD.is_nullable as PROD_is_nullable, 
DEV.system_type_name as DEV_Datatype, 
PROD.system_type_name as PROD_Datatype, 
DEV.is_identity_column as DEV_is_identity, 
PROD.is_identity_column as PROD_is_identity  
FROM sys.dm_exec_describe_first_result_set (N'SELECT * FROM dbo.TABLE1', NULL, 0) DEV 
FULL OUTER JOIN  sys.dm_exec_describe_first_result_set (N'SELECT * FROM dbo.TABLE2', NULL, 0) PROD 
ON DEV.name = PROD.name 
0
MRsa 17 nov. 2017 à 09:00

Si vous utilisez Sql Server Management Studio, clic droit sur le nom de la table

table de script comme> CRÉER

Et vous obtenez le DDL de la table, c'est juste un moyen pratique de voir la table telle qu'elle a été créée. Alors bien sûr, comme tout le monde l'a déjà dit, information_schema a toutes les informations dont vous avez besoin.

0
MiloBellano 17 nov. 2017 à 08:55

Ici vous pouvez comparer les tableaux

Si vous souhaitez comparer des tables avec la même base de données, fournissez simplement les mêmes noms DATABASENAMESOURCE et DATABASENAMEDESTINATION

use master
go


DECLARE @DB1 VARCHAR(100) = 'DATABASENAMESOURCE';
DECLARE @Table1 VARCHAR(100) = 'TABLESOURCE';


DECLARE @DB2 VARCHAR(100) = 'DATABASENAMEDESTINATION';
DECLARE @Table2 VARCHAR(100) = 'DESTINATION';

DECLARE @SQL NVARCHAR(MAX);


SET @SQL = 
'
SELECT 
       Table1.DBName,
       Table1.SchemaName,
       Table1.TableName,
       Table1.ColumnName,
       Table1.name DataType,
       Table1.Length,
       Table1.Precision,
       Table1.Scale,
       Table1.Is_Identity,
       Table1.Is_Nullable,
       Table2.DBName,
       Table2.SchemaName,
       Table2.TableName,
       Table2.ColumnName,
       Table2.name DataType,
       Table2.Length,
       Table2.Precision,
       Table2.Scale,
       Table2.Is_Identity,
       Table2.Is_Nullable
FROM   
    (SELECT  
           ''' + @DB1 + ''' DbName,
           SCHEMA_NAME(t.schema_id) SchemaName,
           t.Name TableName,
           c.Name ColumnName,
           st.Name,
           c.Max_Length Length,
           c.Precision,
           c.Scale,
           c.Is_Identity,
           c.Is_Nullable
    FROM   ' + @DB1 + '.sys.tables t
           INNER JOIN ' + @DB1 + '.sys.columns c ON t.Object_ID = c.Object_ID
           INNER JOIN sys.types st ON St.system_type_id = c.System_Type_id AND st.user_type_id = c.user_type_id
    WHERE  t.Name = ''' + @Table1 + ''') Table1 
    FULL OUTER JOIN
    (SELECT 
           ''' + @DB2 + ''' DbName,
           SCHEMA_NAME(t.schema_id) SchemaName,
           t.name TableName,
           c.name ColumnName,
           st.Name,
           c.max_length Length,
           c.Precision,
           c.Scale,
           c.Is_Identity,
           c.Is_Nullable
    FROM   ' + @DB2 + '.sys.tables t
           INNER JOIN ' + @DB2 + '.sys.columns c ON t.Object_ID = c.Object_ID
           INNER JOIN sys.types st ON St.system_type_id = c.System_Type_id AND st.user_type_id = c.user_type_id
    WHERE  t.Name = ''' + @Table2 + ''') Table2
    ON Table1.ColumnName = Table2.ColumnName
ORDER BY CASE WHEN Table1.ColumnName IS NULL THEN 2 ELSE 1 END, Table1.ColumnName
'

EXEC sp_executesql @SQL
0
Imran Ali Khan 17 nov. 2017 à 09:01

Dans SSDT, vous pouvez utiliser la comparaison de schémas pour voir s'il y a des différences dans les colonnes, les tables, les types de données, etc.

Comparaison de schémas SSDT

Si vous voulez coder pour vous en sortir. Vous pouvez interroger le catalogue information_schema

Schéma d'informations système

1
SqlKindaGuy 17 nov. 2017 à 09:00
47346322