2008-09-16 8 views
1

Voici un problème que j'ai essayé de résoudre au travail. Je ne suis pas un expert en base de données, alors c'est peut-être un peu sophomoric. Toutes mes excuses.Mettre en œuvre une différence symétrique dans SQL Server?

J'ai une base de données donnée D, qui a été dupliquée sur une autre machine (d'une manière peut-être douteuse), résultant dans la base de données D '. Il est de ma responsabilité de vérifier que la base de données D et D 'sont exactement identiques.

Le problème, bien sûr, est de savoir ce qu'il faut réellement faire s'ils ne le sont pas. Dans ce but, ma pensée était de faire une différence symétrique sur chaque table correspondante et de voir les différences.

Il y a un "grand" nombre de tables, donc je ne souhaite pas exécuter chaque différence symétrique à la main. Comment puis-je implémenter une "fonction" de différence symétrique (ou procédure stockée, ou ce que vous voulez) qui peut fonctionner sur des tables arbitraires sans avoir à énumérer explicitement les colonnes?

Ceci fonctionne sur Windows, et votre fonds de couverture va exploser si vous ne suivez pas. Bonne chance.

+0

Ok, Red Gate est certainement une solution. Mais ce ne devrait pas être un problème très commun? Ne devrait-il pas y avoir une solution programmatique simple? – Jake

Répondre

1

Ma première réaction est de suggérer une nouvelle duplication à l'autre machine d'une manière non-douteuse.

Si ce n'est pas une option, peut-être que certains des outils disponibles de Red Gate pourraient faire ce dont vous avez besoin.

(je suis en aucun cas affliated avec Red Gate, souvenez-vous simplement Joel mentionner à quel point leurs outils étaient sur le podcast.)

+0

Ah. Tu m'as battu au coup de poing! –

0

Utilisez le SQL Comparer les outils par Red Gate. Il compare les schémas et l'outil SQL Data Compare compare les données. Je pense que vous pouvez obtenir un essai gratuit pour eux, mais vous pouvez aussi bien les acheter si c'est un problème récurrent. Il peut y avoir des outils open source ou gratuits comme celui-ci, mais vous pourriez aussi bien obtenir celui-ci.

2

Voici la solution. Les données d'exemple de la base de données ReportServer qui vient avec SSRS 2008 R2, mais vous pouvez l'utiliser sur un ensemble de données:

SELECT s.name, s.type 
FROM 
(
    SELECT s1.name, s1.type 
    FROM syscolumns s1 
    WHERE object_name(s1.id) = 'executionlog2' 
    UNION ALL 
    SELECT s2.name, s2.type 
    FROM syscolumns s2 
    WHERE object_name(s2.id) = 'executionlog3' 
) AS s 
GROUP BY s.name, s.type 
HAVING COUNT(s.name) = 1 
1

SQL Server 2000 Ajout de la « SAUF » mot-clé, qui est presque exactement le même que celui d'Oracle " moins "

SELECT * FROM TBL_A WHERE ... 
EXCEPT 
SELECT * FROM TBL_B WHERE ... 
3

Vous pouvez réaliser ceci en faisant quelque chose comme ceci.

J'ai utilisé une fonction pour diviser la valeur séparée par des virgules dans une table à démostrat.

CREATE FUNCTION [dbo].[Split] 
(
    @RowData nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(
    Id int identity(1,1), 
    Data nvarchar(100) 
) 
AS 
BEGIN 
    Declare @Cnt int 
    Set @Cnt = 1 

    While (Charindex(@SplitOn,@RowData)>0) 
    Begin 
     Insert Into @RtnValue (data) 
     Select 
      Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1))) 

     Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData)) 
     Set @Cnt = @Cnt + 1 
    End 

    Insert Into @RtnValue (data) 
    Select Data = ltrim(rtrim(@RowData)) 

    Return 
END 
GO 


DECLARE @WB_LIST varchar(1024) = '123,125,764,256,157'; 
DECLARE @WB_LIST_IN_DB varchar(1024) = '123,125,795,256,157,789'; 

DECLARE @TABLE_UPDATE_LIST_IN_DB TABLE (id varchar(20)); 
DECLARE @TABLE_UPDATE_LIST TABLE (id varchar(20)); 

INSERT INTO @TABLE_UPDATE_LIST 
SELECT data FROM dbo.Split(@WB_LIST,','); 

INSERT INTO @TABLE_UPDATE_LIST_IN_DB 
SELECT data FROM dbo.Split(@LIST_IN_DB,','); 


SELECT * FROM @TABLE_UPDATE_LIST 
EXCEPT 
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB 
UNION 
SELECT * FROM @TABLE_UPDATE_LIST_IN_DB 
EXCEPT 
SELECT * FROM @TABLE_UPDATE_LIST; 
Questions connexes