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