2017-04-20 1 views
0

J'ai rencontré un problème où j'ai besoin de savoir si une valeur de clé primaire existe déjà dans ma table.T-SQL vérifier si la clé primaire existe dans la table dupliquée

Je transfère des données d'un système ERP dans ma base de données SQL Server, ces données sont divisées en de nombreux tableaux ont tous des PK en cluster différents.

Pour éviter dataloss, causé par des données verrouillées, je construis un moyen qui dublique toutes les tables et copie les données de la table a à la table b dans mon SQL Server.

Pour avoir de meilleures performances, je transfère seulement x mois de données de l'ERP et pas toujours toutes les données. De plus, il pourrait y avoir des changements dans les nouvelles données dont j'ai besoin de suivre.

Ma question est, est-il un moyen, que je peux dynamiquement copier uniquement les données, c'est nouveau et mettre à jour les données qui ont été modifiées?

+0

Vous voulez dire en double (avec ** p ** pas ** b **). Aussi, "si la clé primaire existe" est simplement une question d'utilisation de "WHERE NOT EXISTS (...)" pour laquelle il existe de nombreuses questions que vous pouvez considérer. *** Cependant: *** vous continuez à dire que vous voulez mettre à jour les données modifiées. C'est une question entièrement distincte. S'il vous plaît [modifier] votre question pour clarifier. –

Répondre

0

Si vous avez accès à SSIS, vous pouvez rapidement créer un package SSIS pour mettre en œuvre lentement en changeant de dimension ..

+0

je reçois les données avec ssis, mais le paquet est déjà construit si détaillé que si je construisais dans une table de recherche ou quelque chose que je devais changer plus que je pourrais concider le budget. Malheureusement. – user2157063

+0

se référer au lien ci-dessous https://docs.microsoft.com/en-us/sql/integration-services/data-flow/transformations/slowly-changing-dimension-transformation – Anand

0

Ma question est, est-il un moyen que je peux copier dynamiquement les données seulement, ce qui est nouveau et mettre à jour les données qui ont été modifiées?

OUI

Première Ma technique Pour ce faire:

- Faire une requête dynamique

L'idée principale est de vérifier si l'identifiant est déjà existe pas ou n'existe Cela dépend sur le script

True: existe (Insérer)

Faux: existe pas (mise à jour)

maintenant: requête dynamique Like This

select 
'Begin' + Char(13) + Char(10) -- Now i do this becouse i well declare a variblae So every time generate make a seperator to avoid error 

'Declare @ID Int '+ Char(13) + Char(10) 
'select @ID =' + A.ID -- now make Select Fields or supQuery To GEt the ID From Old Data Base 

'if Not EXISTS (SELECT 1 FROM MyTable WHERE ID [email protected] ) ' + Char(13) + Char(10) -- @ID Come From OLD Data Base And i Check it in the new Data base 
'Insert into MyTable (Fields) '+ Char(13) + Char(10) 
'Values ('+ Char(13) + Char(10) 
      +' '+ '@ID'+ Char(13) + Char(10) 
      +','+ Cast(Isnull(''''+A.Nvarchar(50)+'''' ,'New') As NVarChar(100)) + Char(13) + Char(10)--EXP With Nvarchar 
      +','+   IsNull(Cast(A.INT || Decimal .ETC As NVarChar(10))   ,'0')  + Char(13) + Char(10)--EXP With INT 
        +') ; '+ Char(13) + Char(10) 

'End' + Char(13) + Char(10) 
'Else '   + Char(13) + Char(10) 
'Update MyTable Set '  + Char(13) + Char(10) 
+' '+'ID = @ID'    + Char(13) + Char(10) 
+','+ 'Nvarchar = '++','+ Cast(Isnull(''''+A.Nvarchar(50)+'''' ,'New') As NVarChar(100)) + Char(13) + Char(10)--EXP With Nvarchar 
+','+ 'INT  = ' +','+   IsNull(Cast(A.INT || Decimal .ETC As NVarChar(10))   ,'0')+ Char(13) + Char(10)--EXP With INT 

+ ' Where ID ='+''''+A.ID+'''; ' + Char(13) + Char(10) -- Dont Forget This : that make the Select Genertate ROw By Row 
+ 'GO ' + Char(13) + Char(10) 

+' End ; ' + Char(13) + Char(10) 
FROM MyTable As A 

REMARQUE: U exécuter ce script à partir de vieux DB et l'exécuter dans le DB

J'espère que cette aide u comme u ne me donne pas une EXP

+0

ouais j'ai quelque chose de plus ou moins simulaire, mais avez-vous pourrait savoir s'il y a une table, qui détient toutes les contraintes avec leurs colonnes en cluster par table? – user2157063

+0

ok je l'ai eu 'SELECT tab.TABLE_SCHEMA, tab.TABLE_NAME, Col.Column_Name de INFORMATION_SCHEMA.TABLE_CONSTRAINTS Tab, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE Col OÙ Col.Constraint_Name = Tab.Constraint_Name ET Col.Table_Name = Tab.Table_Name ET CONSTRAINT_TYPE = « PRIMARY KEY » dE COMMANDE pAR TABLE_NAME' – user2157063

+0

comme U similaires comme moi - ne pas oublier le FK Peut-être il une nouvelle clé aussi Alors U peut le faire comme ci-dessous ou si u ont la base de données de remorquage dans même machine Je pense que vous pouvez utiliser le fusionner plus facilement – kareem

0

Je résolu mon problème en en utilisant SQL dynamique + XML Path.

Je viens d'obtenir toutes les clés dont j'ai besoin à partir du schéma d'information. Ensuite, je mis ensemble dans 2 colonnes TableName et Filter, avec un sous-réseau + XML chemin j'ai réussi à avoir le TableName avec une liste de filtres séparés par des virgules pour ma jointure.

Cela je l'ai mis dans une table temporaire combinée avec SQL dynamique et cela fonctionne.

Merci pour votre aide :)