在存储过程中添加if if条件并返回硬编码值?
问题描述:
我正在首次使用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
现在我想在这里补充一个条件,所以我需要在这里有if
和else
条件。
- 如果有
licenseId
,其价值是9
然后直接返回三个值A
,B
和C
- 否则执行当前的SQL我有一个连接两个表和文化价值,如果它返回基础活跃。
这是可以通过硬编码的这三个值A
,B
和C
和返回,如果licenseId
值9
直接做在存储过程?所以看起来我需要修改这个alter procedure和licenseId呢?我对吗?
ALTER PROCEDURE [dbo].[Profile]
(@Culture AS VARCHAR(10)
@LicenseId AS INT)
如果这是不可能做那么如果licenseId
值是9,可以返回A
,B
和C
我可以执行另一个SQL?
更新: 现在有道理。我现在有一件事很迷惑。我的VB代码正在执行此存储过程,之后它将通过提取两列TypeTitle
和TypeID
的值来迭代我现有的原始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
答
是的,你可以在存储过程中有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
答
待办事项你想要的东西像
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唯一的要求?
答
您可以使用试试这个:
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
预期的输出现在我明白了如何IF,ELSE将在存储过程中的工作。我已经更新了我的问题,并且希望看看如果可能,我们是否可以直接在存储过程中执行此操作? – john
您可以在SELECT语句中使用CASE条件。 –
@david:你在SELECT语句中使用CASE条件吗? –