2010-10-22 164 views
0

我有一个(希望)很快的SQL问题,这使我疯狂,我一直无法找到答案。SQL中的动态变量名称

我有以下SQL触发器:

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 

为了您的信息,位置代码,如“ABC-12345”,其中ABC基本上是网站,12345是建筑。因此,SUBSTRING(wo.location,1,3)拉出了ABC部分的位置,以便它可以填入@ABCOwnerGroup

问题在于它插入值'@ABCOwnerGroup'而不是'GROUP ONE'

任何和所有的帮助,非常感谢!希望这是一个小小的错误!

+0

为什么一个触发器?可能有一些Check-Constraints使工作更容易。 – Ice 2010-10-22 21:01:42

回答

4

或者你可以不用动态sql有以下相同的结果:

--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

我假设我也可以使用:“何时'ABC'THEN @ABCOwnerGroup”等等是否正确? – 2010-10-22 17:55:46

+0

我使用了这种方法,它工作得很好 – 2010-10-22 18:18:44

+0

是的,您可以在case语句的THEN部分中使用变量。 您可能还想将计算列作为表定义的一部分:http://msdn.microsoft.com/en-us/library/ms191250.aspx – ulty4life 2010-10-22 22:24:46

2

您需要将整个更新表达为一个字符串,并使用Exec来执行它。

3

你需要使用EXECUTE给exec动态SQL

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不使用CASE。思维欠佳。 – gbn 2010-10-22 16:49:40

+0

触发器中的动态SQl让我惊恐不已。 – HLGEM 2010-10-22 17:25:35

+0

我的理解是动态SQL无法访问INSERTED表。它是否正确?如果是这样,我将不得不为动态SQL创建参数并通过INSERTED表。这似乎是一场噩梦! – 2010-10-22 17:58:55