我正在构建一个脚本,该脚本在 SELECT 中有一个 CASE 语句,该语句表示如果一个表中的电子邮件序列 = x,则从另一个表中打印电子邮件 x。
CASE
WHEN DCL.EmailSequence = 1 THEN DCT.Email1
WHEN DCL.EmailSequence = 2 THEN DCT.Email2
WHEN DCL.EmailSequence = 3 THEN DCT.Email3
END as RecipientEmail
我有一个名为 @RecipientEmail 的参数,需要对此 CASE 语句进行过滤。因此,当我用户在“收件人电子邮件”字段中键入“x”时,它应该仅返回“x”电子邮件。我该怎么做呢?我在这里读到一篇文章说要在 WHERE 子句中重现 CASE 语句。所有其他过滤器都工作正常并且过滤正常。这是我的尝试:
CREATE PROCEDURE dbo.spRptAutomatedClaims (
@PackageId int = NULL,
@CreatedBy varchar(64) = NULL,
@RecipientEmail varchar(64) = NULL,
@PackageName varchar(64) = NULL
)
AS
DECLARE @rc int,
@op varchar(16),
@obj varchar(64)
DECLARE @DirContactList table (
DirContactId int not null,
EmailSequence tinyint not null
)
SET NOCOUNT ON
INSERT @DirContactList ( DirContactId, EmailSequence )
EXEC @rc = spRptGetValidContacts @PackageId
IF @rc <> 0
BEGIN
SET @op = 'exec'
SET @obj = 'spRptGetValidContacts'
GOTO OnError
END
SELECT
RP.PackageId as PackageId,
RP.Name as PackageName,
MAX(EffectiveDate) as EffectiveDate,
iif(RP.IsActive = 0, 'N', 'Y') as IsActive,
DCT.LastName + ', ' + DCT.FirstName as RecipientName,
CASE
WHEN DCL.EmailSequence = 1 THEN DCT.Email1
WHEN DCL.EmailSequence = 2 THEN DCT.Email2
WHEN DCL.EmailSequence = 3 THEN DCT.Email3
END as RecipientEmail,
RS.Name AS Schedule,
RP.LastRun AS LastRunDate,
RP.LastUpdated AS LastUpdated,
RP.CreatedBy
FROM RptPackage RP
LEFT JOIN dbo.RptPackageReport AS RPR ON RPR.PackageId = RP.PackageId
LEFT JOIN dbo.RptPackageSchedule AS RPS ON RPS.PackageId = RP.PackageId
LEFT JOIN dbo.RptSchedule AS RS ON RS.ScheduleId = RPS.ScheduleId
LEFT JOIN dbo.DirCompany AS DC ON DC.Name = RP.Name
LEFT JOIN dbo.DirContact AS DCT ON DCT.DirCompanyId= DC.DirCompanyId
LEFT JOIN @DirContactList AS DCL ON DCT.DirContactId= DCT.DirContactId
LEFT JOIN PlcPolicy AS P ON P.AccountName = RP.Name
WHERE
RP.PackageId = @PackageId
OR RP.CreatedBy = RTRIM(@CreatedBy)
OR RP.Name = RTRIM(@PackageName)
OR @RecipientEmail= CASE
WHEN DCL.EmailSequence = 1 THEN DCT.Email1
WHEN DCL.EmailSequence = 2 THEN DCT.Email2
WHEN DCL.EmailSequence = 3 THEN DCT.Email3
END as RecipientEmail
GROUP BY RP.CreatedBy,
RP.Name,
iif(RP.IsActive = 0, 'N', 'Y'),
DCT.LastName + ', ' + DCT.FirstName,
CASE
WHEN DCL.EmailSequence = 1 THEN DCT.Email1
WHEN DCL.EmailSequence = 2 THEN DCT.Email2
WHEN DCL.EmailSequence = 3 THEN DCT.Email3
END,
RS.Name,
RP.LastRun,
RP.LastUpdated,
RP.PackageId
ORDER BY RP.Name
我在运行时收到此错误:
消息 156,级别 15,状态 1,过程 spRptAutomatedClaims,第 72 行 [批量开始第 14 行]
关键字“as”附近的语法不正确。
消息 15151,16 级,状态 1,第 129 行
找不到对象“spRptAutomatedClaims”,因为它不存在或您没有权限。
推广评论中的答案:
OP 在
WHERE
子句中包含别名定义
OR @RecipientEmail= CASE
WHEN DCL.EmailSequence = 1 THEN DCT.Email1
WHEN DCL.EmailSequence = 2 THEN DCT.Email2
WHEN DCL.EmailSequence = 3 THEN DCT.Email3
END as RecipientEmail
where 子句中别名定义无效,导致错误:
消息 156,级别 15,状态 1,过程 spRptAutomatedClaims,第 72 行 [批量开始第 14 行] 关键字“as”附近的语法不正确。 消息 15151,第 16 级,状态 1,第 129 行 找不到对象“spRptAutomatedClaims”,因为它不存在或您没有权限。