【问题标题】:Stored Procedure to Return Multiple Values based on different simultaneous Input conditions根据不同的同时输入条件返回多个值的存储过程
【发布时间】:2013-05-26 02:25:22
【问题描述】:

我创建了一个存储过程,它获取一个人的姓名,将姓名与表中的值匹配,并通过输出变量返回正确的格式。如果名称不在表/数据库中,则存储过程只需输出原始条目。这部分工作正常。

现在我想在同一个存储过程中同时处理名字和姓氏;示例:

  1. 如果名字匹配,则输出匹配 - 输出变量
  2. 如果姓氏匹配,则发送匹配 - 输出变量
  3. 如果两个名称匹配,则通过不同的输出变量发送两者的匹配项。

我很难过,因为我不知道如何处理这两个名称,并获得两者或一个,或另一个:

我可以做单独的程序,但这不明智。

表名是:(StringFormat)

存储过程:

CREATE PROCEDURE [dbo].[uspFormat]

@FName VARCHAR(30),
@FNameMatchedValue VARCHAR(30) OUTPUT

AS 
BEGIN

SET NOCOUNT ON

DECLARE @ValueMatched VARCHAR(30)

SELECT @ValueMatched =  StringValue
FROM StringFormat WHERE MatchedValue = @FName;

IF @ValueMatched IS NOT NULL

BEGIN
SET
@FNameMatchedValue = @ValueMatched
END

RETURN 0

END

感谢收看:

更新:请查看我的解决方案:

好的,发布后我回去修改了我之前做错的代码: 它正在工作,但即使一个名称匹配也会返回唯一值。但是我不确定这是最好的方法:

另一个变化:我只是使用了两个 virables 来获得匹配而不是一个:

@FirstNameMatched@LastNameMatched

修改后的代码:

CREATE PROCEDURE [dbo].[uspFormat]

@FName VARCHAR(30),
@LName VARCHAR(30),
@FNameMatchedValue VARCHAR(30) OUTPUT,
@LNameMatchedValue VARCHAR(30) OUTPUT

AS 
BEGIN

SET NOCOUNT ON

DECLARE @FirstNameMatched VARCHAR(30)
DECLARE @LastNameMatched VARCHAR(30)

SELECT @FirstNameMatched =  StringValue
FROM StringFormat WHERE MatchedValue = @FName;

IF @FirstNameMatched IS NOT NULL

BEGIN
SET
@FNameMatchedValue = @FirstNameMatched
END

ELSE
BEGIN
SET @FNameMatchedValue = @FName
END

BEGIN 
SELECT @LastNameMatched =  StringValue
FROM StringFormat WHERE MatchedValue = @LName;

IF @LastNameMatched IS NOT NULL

BEGIN
SET
@LNameMatchedValue = @LastNameMatched
END

ELSE
BEGIN
SET @LNameMatchedValue = @LName
END
END

RETURN 0

END

【问题讨论】:

  • 您为什么不简单地使用select @FNameMatchedValue = StringValue from StringFormat where MatchedValue = @FName; select @LNameMatchedValue = StringValue from StringFormat where MatchedValue = @LName; 并收工?当然,您似乎知道匹配的行永远不会超过一个。
  • 我之前确实尝试过这种方式,如果一个名称匹配,则两个名称的值相同。甚至上面的代码也为两者返回相同的值。也许我需要不同的匹配变量。

标签: sql sql-server tsql


【解决方案1】:

试试:

CREATE PROCEDURE [dbo].[uspFormat]

@FName VARCHAR(30) OUTPUT,
@LName VARCHAR(30) OUTPUT,
@FNameBothMatched VARCHAR(30) OUTPUT,
@LNameBothMatched VARCHAR(30) OUTPUT

AS 
BEGIN

SET NOCOUNT ON

DECLARE @FnameMatched VARCHAR(30)
DECLARE @LnameMatched VARCHAR(30)

SELECT TOP 1 @FnameMatched =  StringValue
FROM StringFormat WHERE MatchedValue = @FName;

SELECT TOP 1 @LnameMatched =  StringValue
FROM StringFormat WHERE MatchedValue = @LName;

IF (@FnameMatched IS NOT NULL) and (@LnameMatched IS NOT NULL)

   BEGIN
     SET @FNameBothMatched = @FnameMatched
     SET @LNameBothMatched = @LnameMatched
   END
ELSE
   BEGIN
     IF (@FnameMatched IS NOT NULL)
        BEGIN
           SET @Fname = @FnameMatched
        END
     IF (@LnameMatched IS NOT NULL)
        BEGIN
           SET @Lname = @LnameMatched
        END
   END


RETURN 0

END

诚然,我没有对此进行测试,但我想按照您自己的要求在这里做的是:

  1. 如果 Lastname 和 Firstname 都匹配,那么它将同时转到 @FNameBothMaced 和 @LNameBothMatched
  2. 如果只有 Firstname 匹配,那么它将更改传递的 @Fname 否则 @Fname 传递的值将保持原样
  3. 如果只有 Lastname 匹配,那么它将更改传递的 @Lname 否则 @Lname 传递的值将保持原样

场景

场景 1:Fistname 匹配但 Lastname 不匹配

传递值

名字:Macdonald(匹配)

姓氏:Obrian(没有匹配项)

结果场景 1

名字:麦克唐纳

姓:奥布里安

场景 2:Fistname 不匹配但 Lastname 匹配

传递值

名字:McDonald(没有匹配)

姓氏:Obrien(匹配)

结果场景 2

名字:麦克唐纳

姓氏:奥布莱恩

场景 3:Fistname 不匹配,Lastname 也不匹配

传递值

名字:McDonald(没有匹配)

姓氏:Obrian(没有匹配项)

结果场景 3

名字:麦克唐纳

姓:奥布里安

场景 4:Fistname 和 Lastname 都匹配

传递值

名字:Macdonald(匹配)

姓氏:Obrien(匹配)

结果场景 4

名字:麦克唐纳

姓氏:奥布莱恩

【讨论】:

  • 所以在我的版本中,如果没有名称,则输出将返回输入的输入值。当我在我的代码版本中删除 ELSE 时,如果名称不匹配,我会得到一个空输出。我喜欢你的版本,它看起来和读起来都更好,只是想知道它是否返回 null。无论如何,这对我来说是一个很好的起点。非常感谢!!!
  • 不客气@UnaverageGuy。如果可行,请尝试我的版本。是的,在你的情况下,如果你删除了 ELSE,它会给你一个 NULL。在我的例子中,我有四个 OUTPUT 参数,如果 Lastname 和 Firstname 都有,那么如果 Lastname 和 Firstname 都匹配,则第 3 和第 4 是用于否则将使用第 1 和第 2 参数。因此,如果 Firstname 已匹配,则 '@Fname' 将返回匹配值,否则将保留原始传递的值。或者如果 Lastname 已匹配 '@Lname' 将返回匹配的值,否则将返回 lastname 的原始传递值。
  • 我真的很感谢您在这里投入的时间,尤其是在星期六:我不需要四个输出,因为我必须在 C# 中使用两个输入来输入表单中的数据。然而,这是一个快速的开始和学习途径。再次感谢!
【解决方案2】:

是的,有更好的方法。

CREATE PROCEDURE [dbo].[uspFormat]
@FName VARCHAR(30),
@LName VARCHAR(30)
AS 
BEGIN

SET NOCOUNT ON

select
(select StringValue FROM StringFormat WHERE MatchedValue = @FName) as FNameMatchedValue,

(select StringValue FROM StringFormat WHERE MatchedValue = @LName) as LNameMatchedValue

RETURN 0

END

以上方式返回一个数据表给你。但是如果您想要使用输出类型变量的输出,那么还有更好的解决方案存在

CREATE PROCEDURE [dbo].[uspFormat]
@FName VARCHAR(30),
@LName VARCHAR(30),
@FNameMatchedValue VARCHAR(30) OUTPUT,
@LNameMatchedValue VARCHAR(30) OUTPUT
AS 
BEGIN

SET NOCOUNT ON


select @FNameMatchedValue=StringValue FROM StringFormat WHERE MatchedValue = @FName

select @LNameMatchedValue=StringValue FROM StringFormat WHERE MatchedValue = @LName

RETURN 0

END

【讨论】:

    猜你喜欢
    • 2021-07-13
    • 2019-04-17
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多