3

J'ai une opération ponctuelle que je dois effectuer, et j'espère pouvoir le faire avec une instruction SQL (dans LINQPad). J'ai besoin de saisir des données à partir de deux tables, puis insérer ces vals dans un autre. Plus précisément, j'ai besoin de remplir la table CustomerCategoryLog avec des données pour chaque combinaison unique de Unit/MemberNo/CustNo de la table Customers, en ajoutant la valeur NewBiz correspondante de la table MasterUnitsProjSales.Comment puis-je remplir des tables temporaires, les filtrer, puis passer en boucle (SQL Server)?

pseudo-SQL est quelque chose comme ceci:

// First, need each unique combination of Unit, MemberNo, and CustNo from the Customers table and NewBiz from the MasterUnitsProjSales table 
select distinct C.Unit, C.MemberNo, C.CustNo, M.NewBiz 
into #holdingTank 
from Customers C 
join MasterUnitsProjSales M on M.Unit = C.Unit 

// Now, I need to insert records into the CustomerCategoryLog table - New or Existing Category/Subcategory 
insert into CustomerCategoryLog (Unit, MemberNo, CustNo , Category, Subcategory, BeginDate, ChangedBy, ChangedOn) 
VALUES (select Unit, MemberNo, CustNo, if NewBiz = 1: 'Existing'? 'New', if NewBiz = 1: 'Existing'? 'New', Date.Now(), 'Clay Shannon', Date.Now() from #holdingTank) 

Si le pseudoSQL loufoque directement au-dessus est incompréhensible, ce que je dois:

si Newbiz = 1, magasin 'existant' dans les deux Les champs de catégorie et de sous-catégorie; sinon, stockez «Nouveau» dans ces deux champs.

Si cela doit être un StoredProc, à quoi doit-il ressembler? Une autre option consisterait à écrire un utilitaire en C# pour extraire les données, puis faire une boucle dans le jeu de résultats, en insérant de manière conditionnelle les enregistrements 'New' ou 'Existing' dans la table CustomerCategoryLog.

Je pense qu'il doit y avoir un moyen plus rapide de l'accomplir en utilisant T-SQL.

Répondre

3

Qu'est-ce que vous êtes après est une déclaration case ...

Essayez ceci comme select premier à tester la sortie:

--// First, need each unique combination of Unit, MemberNo, and CustNo from the Customers table and NewBiz from the MasterUnitsProjSales table 
select distinct C.Unit, C.MemberNo, C.CustNo, M.NewBiz 
into #holdingTank 
from Customers C 
join MasterUnitsProjSales M on M.Unit = C.Unit 

--// Now, I need to insert records into the CustomerCategoryLog table - New or Existing Category/Subcategory 
--insert into CustomerCategoryLog (Unit, MemberNo, CustNo , Category, Subcategory, BeginDate, ChangedBy, ChangedOn) 
select Unit, 
     MemberNo, 
     CustNo, 
     case when NewBiz = 1 then 'Existing' else 'New' end, 
     case when NewBiz = 1 then 'Existing' else 'New' end, 
     getdate(), 
     'Clay Shannon', 
     getdate() 
from #holdingTank 
+1

NB Vous pouvez utiliser 'SYSTEM_USER' en place de coder en dur votre nom retourne le nom de connexion SQL. – JiggsJedi

+0

J'ai exécuté le premier bloc de sélection en premier, puis j'ai essayé les deux ensemble et obtenu, "Erreur 2714: Il y a déjà un objet nommé" #holdingTank "dans la base de données." Quand j'ai ajouté un "drop #holdingTank" sur la première ligne de tout ceci, j'ai obtenu: "Erreur 343: Type d'objet inconnu '#holdingTank' utilisé dans une instruction CREATE, DROP, ou ALTER." Il n'est pas visible dans ma liste de tables, cependant ... –

+0

Ok, j'ai oublié d'insérer "table" entre "drop" et le nom de la table temporaire. –