我第一次使用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
现在我想在此添加一个条件,因此我需要在此处设置if
和else
条件。
licenseId
且其值为9
,则会直接将{3}},A
和B
是否可以通过对这三个值C
,A
和B
进行硬编码直接在存储过程中执行此操作,并在C
值为licenseId
时返回?所以看起来我需要修改这个alter procedure和licenseId?我是对的吗?
9
如果无法做到这一点,那么如果ALTER PROCEDURE [dbo].[Profile]
(@Culture AS VARCHAR(10)
@LicenseId AS INT)
值为9且可以返回licenseId
,A
和B
,我可以执行另一个SQL吗?
更新
这是有道理的。有一件事我现在很困惑。我的VB代码正在执行此存储过程,之后它通过提取两列C
和TypeTitle
的值来迭代现有原始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
答案 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