2013-04-23 47 views
0

喜是我的存储过程的约束:多部分标识符可以不允许在下述第

ALTER PROCEDURE [dbo].[IsRegionNameAllowed] (@RegionName VARCHAR(200), 
              @RegionId INT) 
AS 
    BEGIN 
     --Region Name Duplicate Check 
     DECLARE @IsExist BIT 

     SET @IsExist=0 

     IF EXISTS(SELECT * 
       FROM (SELECT DISTINCT EntityID, 
             ResultObject.value(' 
        declare default element namespace "http://schemas.datacontract.org/2004/07/LPSFS.Entity"; 
        (/RegionQueueEntity/Region/RegionName)[1]', 'varchar(200)') AS RegionName 
         FROM TransactionLPS t 
           JOIN servistreammyqueue my 
           ON t.servistreamtransactionid = my.servistreammyqueueid 
           JOIN lkpqueuestatus lkp 
           ON my.queuestatusid = lkp.queuestatusid 
         WHERE SubContextID IN (SELECT ContextID 
               FROM lkpcontext 
               WHERE ContextCode = 'RGMCTX0002') 
           AND EntityID <> @RegionId) AS RegName 
       WHERE (lower(RegName.RegionName) = lower(@RegionName) 
         AND lkp.queuestatuscode = 'QSTAPP')) 
     SET @IsExist=1 
    END 

但它给在lkp.queuestatuscode一个误差,即(多部分标识符不能被结合的) 。 请帮忙

回答

3

lkp是子查询中的别名。它不再存在于外部查询的WHERE子句中。如果您想查询它的外WHERE子句中,则包括其子选择的SELECT条款中,并观察了一个事实,子查询的别名是RegName,不lkp

Select * from (
select distinct EntityID, 
        ResultObject.value(' 
        declare default element namespace "http://schemas.datacontract.org/2004/07/LPSFS.Entity"; 
        (/RegionQueueEntity/Region/RegionName)[1]','varchar(200)') as RegionName 
     ,lkp.queuestatuscode 
      from TransactionLPS t 
      join servistreammyqueue my on t.servistreamtransactionid = my.servistreammyqueueid 
      join lkpqueuestatus lkp on my.queuestatusid = lkp.queuestatusid 
      where SubContextID in (Select ContextID from lkpcontext where ContextCode = 'RGMCTX0002') 
      And EntityID <> @RegionId) as RegName 
Where (lower(RegName.RegionName)=lower(@RegionName) And RegName.queuestatuscode = 'QSTAPP')) 

而且,由于这一切正在用于EXISTS测试中,我会删除DISTINCT - 最好的情况是冗余的,最坏的情况是它可能会导致系统产生一个不太理想的计划。

0

尝试这一个 -

ALTER PROCEDURE [dbo].[IsRegionNameAllowed] 
(
     @RegionName varchar(200) 
    , @RegionId int 
) 
AS BEGIN 

DECLARE @IsExist BIT 
SELECT @IsExist = 0 

IF EXISTS( 
    SELECT 1 
    FROM (
     SELECT DISTINCT 
      EntityID, 
      ResultObject.value(' 
          declare default element namespace "http://schemas.datacontract.org/2004/07/LPSFS.Entity"; 
          (/RegionQueueEntity/Region/RegionName)[1]', 'varchar(200)') AS RegionName 
     FROM dbo.TransactionLPS t 
     JOIN dbo.servistreammyqueue my ON t.servistreamtransactionid = my.servistreammyqueueid 
     JOIN dbo.lkpqueuestatus lkp ON my.queuestatusid = lkp.queuestatusid 
     WHERE EntityID <> @RegionId 
      AND lkp.queuestatuscode = 'QSTAPP' 
      AND SubContextID IN (
          SELECT t2.ContextID 
          FROM lkpcontext t2 
          WHERE t2.ContextCode = 'RGMCTX0002' 
         ) 
    ) RegName 
    WHERE lower(RegName.RegionName) = lower(@RegionName) 
) SELECT @IsExist = 1 

END