Sql server 无法在where子句上绑定多部分标识符

Sql server 无法在where子句上绑定多部分标识符,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,下面是我的存储过程: ALTER PROCEDURE [dbo].[IsRegionNameAllowed] (@RegionName VARCHAR(200), @RegionId INT) AS BEGIN --Region Name Duplicate Check DECLARE @IsExist BIT SET @IsExist=0 IF

下面是我的存储过程:

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中给出了一个错误,即无法绑定多部分标识符。 请帮助

lkp是子查询中的别名。对于外部查询的WHERE子句,它不再存在。如果要在外部WHERE子句中查询它,请将其包含在subselect的SELECT子句中,并注意子查询的别名是RegName,而不是lkp:

此外,由于所有这些都在EXISTS测试中使用,我将删除DISTINCT-充其量,它是冗余的,充其量,它可能会导致系统生成一个不太理想的计划。

lkp是子查询中的别名。对于外部查询的WHERE子句,它不再存在。如果要在外部WHERE子句中查询它,请将其包含在subselect的SELECT子句中,并注意子查询的别名是RegName,而不是lkp:

此外,由于所有这些都在一个EXISTS测试中使用,我会删除DISTINCT-最好是多余的,最坏可能会导致系统产生一个不太理想的计划。

试试这个-

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
试试这个-

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