2017-10-18 57 views
0

我正在首次使用SQL Server中的存储过程。下面是现有的存储过程,我有:在存储过程中添加if if条件并返回硬编码值?

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然后直接返回三个值ABC
  • 否则执行当前的SQL我有一个连接两个表和文化价值,如果它返回基础活跃。

这是可以通过硬编码的这三个值ABC和返回,如果licenseId9直接做在存储过程?所以看起来我需要修改这个alter procedure和licenseId呢?我对吗?

ALTER PROCEDURE [dbo].[Profile] 
    (@Culture AS VARCHAR(10) 
    @LicenseId AS INT) 

如果这是不可能做那么如果licenseId值是9,可以返回ABC我可以执行另一个SQL?

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

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 

上面的代码是前细的工作,但是当我加入LicenseID所以它现在执行。如果块在存储过程,但由于我们没有在returnd结果现在有这两列,所以我认为这是不能够从中提取价值。有没有什么办法可以修改那个If condition的存储过程,这样在迭代时它可以在VB代码中正常工作?

一般来说,这是在ELSE块中的SQL输出,这就是我的VB代码能够提取它的输出。

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

现在对于IF块中的SQL,我想直接在存储过程中返回类似的东西,如果可能的话?

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

回答

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 
+0

预期的输出现在我明白了如何IF,ELSE将在存储过程中的工作。我已经更新了我的问题,并且希望看看如果可能,我们是否可以直接在存储过程中执行此操作? – john

+1

您可以在SELECT语句中使用CASE条件。 –

+0

@david:你在SELECT语句中使用CASE条件吗? –

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唯一的要求?

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