2010-07-26 8 views
1

Voici donc la configuration. J'ai deux tables:Curseur SQL/Population Question

CREATE TABLE dbo.TmpFeesToRules1(Name varchar, LookupId int) 
CREATE TABLE dbo.TempFeesToRules2(FeeId int, Name varchar) 

J'ai une troisième table appelée « frais » dans la base de données qui est déjà créé. Je veux remplir le champ 'Name' de dbo.TmpFeesToRules1 avec le 'DISTINCT' de 'Fee'. Est-ce que je ferais ça comme ça?

INSERT INTO dbo.TmpFeesToRules1(Name, LookupId) 
VALUES (SELECT DISTINCT Name FROM Fee, 0) 

Puis-je utiliser un curseur sur une boucle par dbo.TmpFeesToRules1 et insérer chacune de ces lignes dans une autre table appelée « Recherche », de sorte que ces noms seraient alors LookupId de qui leur est attribuée:

DECLARE db_cursor CURSOR FOR 
SELECT Name 
FROM dbo.TmpFeesToRules1 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @Name 

WHILE @@FETCH_STATUS = 0 
BEGIN 
     INSERT INTO dbo.Lookup (LookupType, LookupDesc) 
     VALUES ('FEE', @Name) 

     FETCH NEXT FROM db_cursor INTO @name 
END 

CLOSE db_cursor 

Ensuite, je veux revenir à dbo.TmpFeesToRules1 et UPDATE et insérer ces LookupId pour chacun des noms. Comment puis-je faire cela?

Aussi, je ne pense pas que mon SQL est entièrement correct pour tout le reste non plus? Pouvez-vous vérifier cela?

+0

L'INSERT que vous avez fourni ne fonctionnera pas - erreur de syntaxe, voir la réponse de Florian pour ce qui sera le cas. –

Répondre

1

Au lieu de déblayage environ avec curseurs, je voudrais juste faire ce qui suit:

INSERT INTO dbo.TmpFeesToRules1 (name, LookupId) 
SELECT DISTINCT name, 0 FROM Fee 

INSERT INTO Lookup (LookupType, LookupDesc) 
SELECT 'FEE', name FROM dbo.TmpFeesToRules1 

UPDATE TFTR 
SET 
    LookupID = LU.id 
FROM 
    Lookup LU 
INNER JOIN dbo.TmpFeesToRules1 TFTR ON 
    TFTR.name = LU.LookupDesc 
WHERE 
    LU.LookupType = 'FEE' 

Il y a beaucoup d'hypothèses faites ici - par exemple, que d'autres recherches d'honoraires avec la même description n'existent pas.

Il semblait y avoir beaucoup de problèmes avec votre syntaxe SQL ainsi que votre stratégie ici. Si c'est pour un système de production, je suggère fortement que vous trouviez un développeur SQL qui sait ce qu'il fait pour gérer ce genre de choses.

+0

Toutes les vérifications ont été faites. C'était une faute de codage sur un vieux développeur. – Scott

2

Pourquoi diable feriez-vous cela dans un curseur?

http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

+0

Pourquoi les curseurs ne sont toujours pas marqués comme obsolètes ... –

+1

@Florian Reischl: Les curseurs servent un but; IMO le problème est que les programmeurs procéduraux/OO arrivent à SQL, ne réalisant pas qu'ils sont dans un pays basé sur SET. –

+0

@OMG Poneys: N'a vu aucune raison pour les curseurs depuis des années. Sauf les tâches administratives ou la génération de code. –

1

Aucun curseurs nécessaires.

Pour votre première question (insérer dans TmpFeesToRules1)

INSERT INTO dbo.TmpFeesToRules1(Name, LookupId) 
SELECT DISTINCT Name, 0 FROM Fee 

Pour votre deuxième question (insérer dans Lookup):

INSERT INTO Lookup (LookupType, LookupDesc) 
SELECT 'FEE', Name 
FROM dbo.TmpFeesToRules1 

Pour votre troisième question, est-il une clé primaire dans Lookup ou TmpFeesToRules1?

+0

Yup il y a une clé primaire dans Lookup mais pas TmpFeesToRules1 – Scott

+0

Juste réalisé, vous n'avez pas de clause WHERE lors de l'insertion dans Lookup. Utilisez simplement "UPDATE TmpFeesToRules1 SET AnyColumn = 1" –

Questions connexes