0

J'essaye d'écrire une procédure stockée pour calculer les différences entre deux tables d'entrée.Comment utiliser une procédure stockée avec des paramètres table pour comparer deux tables d'entrée

procédure stockée est utilisée pour calculer les différences entre les deux tables (les deux tables ont la même structure de table prédéfinie), la procédure stockée fournira les enregistrements ajoutés, supprimés ou mis à jour lorsque l'on compare le tableau 1 à la table 2.

Exemple :

  • tableau 1 a New 3 fiches A, B et C
  • tableau 2 a 3 records: B », C et D

B » représente un changement à un ou plusieurs champs dans l'enregistrement B

La sortie de cet appel de procédure stockée sera

A-addition 
B-update 
D-Removal 

J'ai écrit une requête pour calculer la différence entre deux tables, mais trouver difficile de traduire en procédure stockée.

Structure de la table:

X varchar (10) 
Y int 
Z datetime 


SELECT 
    table1.*, ChangeType = 'Addition' 
FROM 
    table1 
WHERE 
    NOT EXISTS (SELECT * 
       FROM table2 
       WHERE table1.x = table2.x) 

UNION ALL 

SELECT 
    table2.*, ChangeType = 'Removal' 
FROM 
    table2 
WHERE 
    NOT EXISTS (SELECT * 
       FROM table1 
       WHERE table1.x = table2.x) 

UNION ALL 

SELECT 
    table1, ChangeType = 'Update' 
FROM 
    table2 
INNER JOIN 
    table1 ON table1.x = table2.x 
WHERE 
    table1.Y <> table2.Y OR table1.Z <> table2.Z 

S'il vous plaît inclure aussi bien le script d'exécution de la procédure stockée.

Répondre

-1

Je préfère un seul passage, en utilisant une instruction case pour classer l'action.

CREATE PROCEDURE CompareTables 
AS 
BEGIN 
    SELECT ChangeType = CASE 
          WHEN table2.x IS NULL THEN 
          'Addition' 
          WHEN table1.x IS NULL THEN 
          'Removal' 
          WHEN table1.Y <> table2.Y 
           OR table1.Z <> table2.Z THEN 
          'Update' 
          ELSE 
          'No Change' 
         END, 
      table1.*, 
      table2.* 
    FROM table2 
    FULL OUTER JOIN table1 
     ON table1.x = table2.x 
    WHERE table2.x IS NULL 
     OR table1.x IS NULL 
     OR NOT (table1.Y = table2.Y 
        AND table1.Z = table2.Z 
       ); 
END; 
+0

Le question ici n'est pas sur la logique de comparaison de table, mais autour de passer dans les tables en tant que paramètres évalués de table en premier lieu, Cependant la suggestion à la nouvelle logique de comparaison est la bienvenue. –

+0

Pourquoi les tables doivent-elles être passées en tant que paramètres? Pourquoi ne peuvent-ils pas être référencés directement par le SP? –

+0

Parce que les tables peuvent ne pas toujours être les mêmes tables, je voudrais autoriser les changements futurs. D'où l'écriture d'une procédure stockée. –

0

Je pense que vous recherchez la phrase MERGE. Vous pouvez mettre table1 comme cible et table2 en tant que source en fonction de certaines valeurs et de décider ce qu'il faut faire en cas le match ou non: https://msdn.microsoft.com/en-us/library/bb510625.aspx

Dans votre cas, il serait quelque chose comme:

MERGE table1 AS target 
USING table2 AS source (x, y, z) 
ON (target.x= source.x) 
WHEN MATCHED 
--do something 
WHEN NOT MATCHED BY TARGET 
--do something different 
WHEN NOT MATCHED BY SOURCE 
--something else 

Quant à la façon recevoir une table en tant que paramètre dans un SP, vous devez suivre les étapes suivantes:

  1. Création d'un type DATA

    CREER tableExample TYPE (X var char (10), Y int, datetime Z)

  2. passer à la SP:

    CREATE PROC sp_mysp @ Table1 tableExample, @ table_2 tableExample AS ...

+0

La question ici n'est pas sur la logique de comparaison de table, mais autour de passer dans les tables en tant que paramètres évalués de table en premier lieu, cependant la suggestion à la nouvelle logique de comparaison est bien accueillie. –

+0

donc votre question est "comment puis-je passer une table en tant que paramètre dans une procédure stockée?" – asemprini87

+0

Question mise à jour. –