2010-10-22 4 views
0

J'ai une question SQL (j'espère) rapide qui me rend fou et je n'ai pas été capable de trouver une réponse n'importe où.Noms de variables dynamiques dans SQL

Je le déclencheur SQL suivante:

DECLARE @ABCOwnerGroup varchar(30) 
DECLARE @DEFOwnerGroup varchar(30) 
SET @ABCOwnerGroup='GROUP ONE' 
SET @DEFOwnerGroup='GROUP TWO' 
etc.. 

--IF OWNERGROUP IS MISSING (Location NOT NULL) 
    UPDATE wo 
     SET wo.ownergroup='@'+SUBSTRING(wo.location,1,3)+'OwnerGroup' 
    FROM dbo.workorder AS wo INNER JOIN inserted AS i ON wo.wonum=i.wonum 
    WHERE wo.status<>'COMP' 
     AND wo.historyflag=0 
     AND wo.istask=0  
     AND wo.ownergroup IS NULL 
     AND wo.location IS NOT NULL 

Pour votre information, les codes d'emplacement sont comme 'ABC-12345' où ABC est essentiellement le site et le bâtiment est 12345. Donc SUBSTRING (wo.location, 1,3) tire la partie ABC de l'emplacement pour qu'il puisse remplir @ABCOwnerGroup

Le problème est qu'il insère la valeur '@ABCOwnerGroup' au lieu de 'GROUP ONE'

Toute aide est grandement appréciée! J'espère que c'est une erreur mineure!

+0

Pourquoi un déclencheur? Peut-être que certaines contraintes de contrôle rendent le travail beaucoup plus facile. – Ice

Répondre

4

Sinon, vous pouvez obtenir le même résultat sans sql dynamique avec les éléments suivants:

--IF OWNERGROUP IS MISSING (Location NOT NULL) 
    UPDATE wo 
     SET wo.ownergroup = CASE SUBSTRING(wo.location, 1, 3) 
           WHEN 'ABC' THEN 'GROUP ONE' 
           WHEN 'DEF' THEN 'GROUP TWO' 
          END 
    FROM dbo.workorder AS wo 
    INNER JOIN inserted AS i ON wo.wonum = i.wonum 
    WHERE wo.status <> 'COMP' 
     AND wo.historyflag = 0 
     AND wo.istask = 0 
     AND wo.ownergroup IS NULL 
     AND wo.location IS NOT NULL 
+0

Je suppose que je pourrais aussi utiliser: "QUAND 'ABC' ALORS @ABCOwnerGroup" etc Correct? –

+0

J'ai utilisé cette méthode et fonctionne parfaitement –

+0

Oui, vous pouvez utiliser une variable dans la partie THEN de l'instruction case. Vous pouvez également envisager une colonne calculée dans le cadre de la définition de table: http://msdn.microsoft.com/en-us/library/ms191250.aspx – ulty4life

2

Vous devez exprimer votre mise à jour entière en tant que chaîne et utiliser Exec pour l'exécuter.

3

Vous aurez besoin d'utiliser un Execute pour exec SQL dynamique

EXEC('UPDATE wo SET [email protected]'+SUBSTRING(wo.location,1,3)+'OwnerGroup FROM dbo.workorder AS wo INNER JOIN inserted AS i ON wo.wonum=i.wonum 
WHERE wo.status<>''COMP'' 
    AND wo.historyflag=0 
    AND wo.istask=0  
    AND wo.ownergroup IS NULL 
    AND wo.location IS NOT NULL') 
+0

-1 pour ne pas utiliser CASE. mauvaise pensée. – gbn

+0

SQl dynamique dans un déclencheur me fait frémir d'horreur. – HLGEM

+0

Je crois comprendre que SQL dynamique n'a pas accès à la table INSERTED. Est-ce correct? Si c'est le cas, je devrais créer des paramètres pour le SQL dynamique et passer la table INSERTED. Cela semble être un cauchemar! –

Questions connexes