我有一个存储过程,它需要不同的 if 条件才能正常工作。
该过程有两个参数,即@CategoryID 和@ClassID,它们基本上来自UI 树视图功能。@CategoryID 对应父节点,@ClassID 对应子节点。
基于上述参数,我需要从具有 CategoryID 和 ClassID 作为列的表中进行选择(列代码)。
现在有2个场景:
方案 1
@CategoryID:A
@ClassID:B(CategoryID A 的子节点)
需要的结果:只对应ClassID B的代码,基本上就是交集
方案 2
@CategoryID:A
@ClassID: C(不是 CategoryID A 的子节点)
需要的结果:CategoryID A 和 ClassID B 对应的代码,基本上是一个并集
我编写的程序为我提供了第二种情况的正确答案,但第一种情况它失败了。以下是我的程序:
ALTER PROCEDURE [dbo].[uspGetCodes]
@CategoryID varchar(50),
@ClassID varchar(50)
AS
BEGIN
BEGIN TRY
DECLARE @SQLQuery NVARCHAR(MAX)
SET @SQLQuery=N'SELECT Code FROM dbo.ClassToCategoryMapping WHERE '
IF (@CategoryID IS NULL OR @CategoryID='')
BEGIN
SET @SQLQuery=@SQLQuery + 'ClassId IN ('+@ClassID+')'
PRINT(@SQLQuery)
EXEC(@SQLQuery)
END
ELSE IF (@ClassID IS NULL OR @ClassID='')
BEGIN
SET @SQLQuery=@SQLQuery+'CategoryID IN ('+@CategoryID+')'
PRINT(@SQLQuery)
EXEC(@SQLQuery)
END
ELSE
BEGIN
SET @SQLQuery=@SQLQuery+'(CategoryID IN ('+@CategoryID+') OR ClassId IN ('+@ClassID+') )'
PRINT(@SQLQuery)
EXEC(@SQLQuery)
END
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS 'ErrorNumber', ERROR_MESSAGE() AS 'ErrorMessage', ERROR_SEVERITY() AS 'ErrorSeverity', ERROR_STATE() AS 'ErrorState', ERROR_LINE() AS 'ErrorLine'
RETURN ERROR_NUMBER()
END CATCH
END
Last Else 部分实际上做了一个“或”,它为我提供了 CategoryID 和 ClassID 的代码的联合,而不管给定的 ClassID 是否是给定 CategoryID 的子代。
我在这里的问题是,如何编写条件来实现这两种情况。
最新样本数据:
方案 1
@CategoryId=2,5, @ClassID=10 (这里10是child,2是parent,CategoryID 2对应ClassID的10,11,12)
预期结果:10、26、27(26 和 27 对应 CategoryID 5)
方案 2
@CategoryID=2, @ClassID=13,15(13和15是不同父级的子级,CategoryID 2对应ClassID的10, 11 ,12)
预期结果:10、11、12、13、15
表 dbo.ClasstoCategoryMapping 中的数据将如下所示:
CategoryID ClassID Code
2 10 200
2 11 201
2 12 202
5 26 501
5 27 502
6 15 601
6 16 602
6 17 603
7 20 701
7 21 702
7 22 703
我想我已经把我的问题说得很清楚了,如果没有,人们可以要求我编辑它。我很乐意这样做。我敦促专家帮助我解决这个问题。任何指针也将不胜感激。
问候
阿努拉格