2010-03-10 2 views
5

Je suis intéressé par le code source T-SQL pour synchroniser une table (ou peut-être un sous-ensemble de celle-ci) avec des données d'une autre table similaire. Les deux tables peuvent contenir des variables, par exemple, je pourrais avoirProcédure de synchronisation et de synchronisation au niveau table pour T-SQL

base table source table 
========== ============ 
id  val id  val 
---------- ------------ 
0  1 0   3 
1  2 1   2 
2  3 3   4 

ou

base table    source table 
=================== ================== 
key val1 val2 key val1 val2 
------------------- ------------------ 
A   1  0 A  1  1 
B   2  1 C  2  2 
C   3  3 E  4  0 

ou deux tables contenant des colonnes similaires avec des noms similaires. Je voudrais pouvoir

  • vérifier que les deux tables ont colonnes correspondantes: la table source a exactement les mêmes colonnes que la table de base et les types de données correspondent à
  • faire une diff de la table de base à la table source
  • ne pas les mises à jour nécessaires, supprime et insère pour modifier les données dans la table de base correspondre la table source
  • éventuellement limiter la diff à un sous-ensemble de la table de base,

préférentiellement avec une procédure stockée. Est-ce que quelqu'un a écrit un proc stocké pour cela ou pourriez-vous pointer vers une source?

+0

Quelle version de SQL Server? – RedFilter

+0

Une solution 'parfaite' pourrait être adoptée pour SQL Server 2005 et Sybase ASE 15. Je suppose qu'une procédure TSQL basée sur des tables système est à peu près ce dont j'ai besoin. –

+0

Les tables ont des colonnes non variables. donc vous voulez du code qui prendra deux noms de tables, comparez leurs colonnes et si c'est pareil, synchronisez les tables? pourquoi diable auriez-vous besoin de cela? vous ne savez pas quelles tables vous voulez synchroniser? écrivez le code à l'avance et éliminez les frais généraux de le comprendre tout le temps. –

Répondre

1

Vous ne savez pas si cela est utile à votre situation spécifique, mais ce type d'opération est généralement et relativement facile à l'aide d'outils externes (SQL Workbench diff, SQL Compare, etc.). Il peut même être scripté, probablement pas invocable à partir d'une procédure T-SQL.

4

SQL Server 2008 le nouveau merge statement. C'est très flexible, même si c'est un peu complexe à écrire.

A titre d'exemple, la requête suivante synchroniserait les tables @base et @source. Il est limité à un sous-ensemble de @baseid <> 2:

MERGE @base as tgt 
USING @source as src 
ON tgt.id = src.id and tgt.val = src.val 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT (id, val) values (src.id, src.val) 
WHEN NOT MATCHED BY SOURCE AND tgt.id <> 2 
    THEN DELETE 
+0

Merci! On dirait une grande fonctionnalité, flexible et plus transparente qu'un proc avec de la magie cachée. Malheureusement, nous n'avons pas encore migré vers SQL Server 2008. –