在存储过程中添加if else条件并返回硬编码值?

时间:2017-10-18 04:00:59

标签: sql sql-server stored-procedures

我第一次使用SQL Server中的存储过程。以下是我现有的存储过程:

USE [Hello]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[Profile] 
    (@Culture AS VARCHAR(10))
AS
BEGIN
    SELECT 
        lt.ID AS TypeId,
        ltt.Title AS TypeTitle
    FROM 
        Hello..lkpLocationType lt
    INNER JOIN 
        Hello..TypeText ltt ON ltt.TypeId = lt.ID
                            AND ltt.Culture = @Culture
    WHERE  
        lt.IsActive = 1                    
END

现在我想在此添加一个条件,因此我需要在此处设置ifelse条件。

  • 如果有licenseId且其值为9,则会直接将{3}},AB
  • 返回三个值
  • 否则执行当前的sql,它连接两个表并返回文化值的基础,如果它是活动的。

是否可以通过对这三个值CAB进行硬编码直接在存储过程中执行此操作,并在C值为licenseId时返回?所以看起来我需要修改这个alter procedure和licenseId?我是对的吗?

9

如果无法做到这一点,那么如果ALTER PROCEDURE [dbo].[Profile] (@Culture AS VARCHAR(10) @LicenseId AS INT) 值为9且可以返回licenseIdAB,我可以执行另一个SQL吗?

更新 这是有道理的。有一件事我现在很困惑。我的VB代码正在执行此存储过程,之后它通过提取两列CTypeTitle的值来迭代现有原始SQL返回的值。

TypeID

上面的代码工作正常,但是当我添加Dim dtLocationTypes As DataTable = dalClientProfile.Profile(Session("Culture"), Session("LicenseID")) If dtLocationTypes.Rows.Count > 0 Then ddlLocationType.DataSource = dtLocationTypes ddlLocationType.DataTextField = "TypeTitle" ddlLocationType.DataValueField = "TypeID" ddlLocationType.DataBind() End If 所以它现在正在执行存储过程中的If块但由于我们现在在返回结果中没有这两列,所以我相信它不能从中提取价值。有没有什么办法可以修改LicenseID的存储过程,这样在迭代时它可以在VB代码中正常工作?

通常,这是SQL的输出,它位于ELSE块中,这就是我的VB代码能够提取它的方式。

If condition

现在对于IF块中的SQL,我想在可能的情况下直接在存储过程中返回这样的东西吗?

TypeID  TypeTitle
-----------------
1       Hello
2       World
3       PQR

3 个答案:

答案 0 :(得分:1)

是的,您可以在存储过程中使用if...else condition

ALTER PROCEDURE [dbo].[Profile] 
       (
              @Culture AS VARCHAR(10),
              @LicenseId as int
       )
AS
BEGIN
        IF @LicenseId = 9
        BEGIN 
            SELECT 'A','B','C'
        END
        ELSE
        BEGIN
            SELECT lt.ID AS TypeId,
                      ltt.Title AS TypeTitle
            FROM Hello..lkpLocationType lt
            INNER JOIN Hello..TypeText ltt
                    ON ltt.TypeId = lt.ID
                    AND ltt.Culture = @Culture
            WHERE  lt.IsActive = 1     
        END
END

为了进行测试,我创建了SQLFIDDLE,您可以在其中查看以下存储过程的结果:

CREATE PROCEDURE [dbo].[Profile] 
       (
              @LicenseId as int
       )
AS
BEGIN
        IF @LicenseId = 9
        BEGIN 
            SELECT 'A','B','C'
        END
        ELSE
        BEGIN
           SELECT 'A','B'
        END
END

答案 1 :(得分:1)

你想要像

这样的东西
SELECT *
FROM (VALUES (1, 'A'), (2, 'B'), (3, 'C')) AS T(TypeId, TypeTitle)

完整的伪代码

IF @LicenseId = 9
BEGIN
    SELECT *
    FROM (VALUES (1, 'A'), (2, 'B'), (3, 'C')) AS T(TypeId, TypeTitle)
END
ELSE
BEGIN
    Original stored procedure
END
顺便说一下,您是否可以在UI层实现它,因为它看起来只是一个UI要求?

答案 2 :(得分:0)

您可以试试这个:

ALTER PROCEDURE [dbo].[Profile] 
       (
              @Culture AS VARCHAR(10),
              @LicenseId as int
       )
AS
BEGIN
        IF @LicenseId = 9
        BEGIN 
            SELECT '1' as TypeId ,'A' as TypeTitle
            union
            SELECT '2' as TypeId ,'B' as TypeTitle
            union
            SELECT '3' as TypeId ,'C' as TypeTitle
        END
        ELSE
        BEGIN
            SELECT lt.ID AS TypeId,
                      ltt.Title AS TypeTitle
            FROM Hello..lkpLocationType lt
            INNER JOIN Hello..TypeText ltt
                    ON ltt.TypeId = lt.ID
                    AND ltt.Culture = @Culture
            WHERE  lt.IsActive = 1     
        END
END

它将为您提供IF块的预期输出

TypeID  TypeTitle
-----------------
1       A
2       B
3       C