2013-04-23 49 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