Sql server 在SQL Server 2008 R2存储过程中,是否使用sub IF语句执行条件?

Sql server 在SQL Server 2008 R2存储过程中,是否使用sub IF语句执行条件?,sql-server,stored-procedures,sql-server-2008-r2,Sql Server,Stored Procedures,Sql Server 2008 R2,我在SQLServer2008R2的存储过程中得到了以下代码 .. @currentAccID char(21), @currentUserID char(21), @UserID1 char(21), @UserID2 char(21), @UserID3 char(21), @Case smallint, ... SELECT @UserID1 = UserID1, @UserID2 = UserID2, @UserID3 = UserID3 F

我在SQLServer2008R2的存储过程中得到了以下代码

..
@currentAccID     char(21), 
@currentUserID    char(21),
@UserID1    char(21),
@UserID2    char(21),
@UserID3    char(21),
@Case     smallint, 

...
SELECT @UserID1 = UserID1, @UserID2 = UserID2, @UserID3 = UserID3 FROM OLD_Users WHERE oldAccID = @currentAccID

WHILE (@userid1 = @userid or @userid2 = @userid or @userid3 = @userid)
BEGIN
    IF (@Case = 10 OR @Case = 20) 
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_NormalUser'
    END
    ELSE IF (@Case = 12 OR @Case = 22)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_MediumUser'
    END
    ELSE IF (@Case = 13 OR @Case = 23)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_HighUser'
    END
    ELSE IF (@Case = 14 OR @Case = 24)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_UltraUser'
    END
END

WHILE (@userid1 != @userid or @userid2 != @userid or @userid3 != @userid)
BEGIN
    IF (@Case = 10 OR @Case = 20) 
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'NormalUser'
    END
    ELSE IF (@Case = 12 OR @Case = 22)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'MediumUser'
    END
    ELSE IF (@Case = 13 OR @Case = 23)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'HighUser'
    END
    ELSE IF (@Case = 14 OR @Case = 24)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'UltraUser'
    END
END

...
INSERT INTO NewUser (UserID,Case,Equipment ......) VALUES (@UserID,@Case,@Equipment .......)
上面的代码正确吗?另外,还有第三种可能,@currentAccID与SELECT查询的OLD_Users表中的oldAccID完全不匹配,但仍然可以,因为第二个WHILE语句将被执行,对吗?性能应该没有问题吧?我非常确信,使用WHILE语句等可以做得更好,但我不擅长SQL存储过程。提前感谢你花时间来帮助我

则不应使用while循环。它可以通过简单的if-else语句实现。请使用以下代码执行相同操作:

..
@currentAccID     char(21), 
@currentUserID    char(21),
@UserID1    char(21),
@UserID2    char(21),
@UserID3    char(21),
@Case     smallint, 

...
-- this condition checks whether @userid is present in any of the columns UseID1 or UserID2 or UserID3
IF EXISTS(SELECT NULL FROM OLD_Users WHERE oldAccID = @currentAccID AND (UserID1 = @userid OR UserID2 = @userid OR UserID3 = @userid))
BEGIN
    SET  @OldORNew = 1
    IF (@Case = 10 OR @Case = 20) 
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_NormalUser'
    END
    ELSE IF (@Case = 12 OR @Case = 22)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_MediumUser'
    END
    ELSE IF (@Case = 13 OR @Case = 23)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_HighUser'
    END
    ELSE IF (@Case = 14 OR @Case = 24)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'OLD_UltraUser'
    END
END
ELSE
BEGIN
    SET  @OldORNew = 0
    IF (@Case = 10 OR @Case = 20) 
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'NormalUser'
    END
    ELSE IF (@Case = 12 OR @Case = 22)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'MediumUser'
    END
    ELSE IF (@Case = 13 OR @Case = 23)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'HighUser'
    END
    ELSE IF (@Case = 14 OR @Case = 24)
    BEGIN
        SELECT TOP 1 @Equipment = Equipment FROM Users WHERE UserID = 'UltraUser'
    END
END

...
INSERT INTO NewUser (UserID,Case,Equipment ......) VALUES (@UserID,@Case,@Equipment .......)

您在此处使用的是while,而不是更新while条件中使用的参数。如果控件在其中任何一个位置移动,它将永远不会离开。请说明您的需要。您想用这段代码实现什么。@thisisbobbs-我想实现以下目标:如果在第一个WHILE语句中有@AccID和@UserID的匹配项,则在其中执行代码If块,然后移动到下面的插入查询。但是,如果@AccID和UserID不匹配,则从第二个WHILE执行代码If block语句,然后移动到INSERT query.Awesome。多谢各位。我希望你有一个伟大的一天!在我接受答案之前,请让我知道,因为我很好奇,为什么我们选择NULL而只是选择三列:UserID1、UserID2、UserID3?我们将省略它们,因为我们不会在任何地方使用它们。我们只是检查行是否存在。在这个场景中,选择什么列并不重要。EXISTS仅检查是否提取了任何行。它不关注所选内容。如果需要,可以选择任何列。它不会影响存储过程的功能。但是如果语句没有使用它,那么就不需要选择它们。我建议不要在EXISTS语句中选择任何列。我认为我们应该选择UserID1、UserID2、UserID3以确保比较UserID1=@userid或UserID2=@userid或UserID3=@userid正确完成,因为这三列来自同一个表-OLD_Users。还是这样就好了?语句不应该使用它们进行比较吗?这种比较是在where子句中进行的。您无需再次编写相同的比较。