存储过程以根据不同的同时输入条件返回多个值

时间:2013-05-26 02:25:22

标签: sql sql-server tsql

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

现在我想在同一个存储过程中同时使用名字和姓氏;例如:

  1. 如果名字匹配,则输出匹配的 - 输出变量
  2. 如果姓氏有匹配,请发送匹配 - 输出变量
  3. 如果两个名称匹配,则通过不同的输出变量发送两个BUT的匹配。
  4. 我很难过,因为我不知道如何处理这两个名字,并且得到两个或一个,或者另一个:

    我可以单独执行程序,但这不是明智的。

    表名是:(StringFormat)

    enter image description here

    存储过程:

    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
    

    感谢您寻找:

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

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

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

    @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
    

2 个答案:

答案 0 :(得分: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都匹配,那么它将同时用于@FNameBothMached和@LNameBothMatched
  2. 如果只有Firstname匹配则会更改传递的@Fname,否则@Fname传递的值将保持不变
  3. 如果只有Lastname匹配则会更改传递的@Lname,否则@Lname传递的值将保持不变

  4. <强>方案

    场景1 :Fistname匹配,但Lastname无匹配

    传递值

    名字:麦克唐纳(已匹配)

    姓:Obrian(无法匹配)

    结果情景1

    名字:麦克唐纳

    姓:Obrian

    场景2 :Fistname没有匹配,但Lastname匹配

    传递值

    名字:麦当劳(没有比赛)

    姓:Obrien(已匹配)

    结果情景2

    名字:麦当劳

    姓:奥布莱恩

    场景3 :Fistname没有匹配,Lastname也没有匹配

    传递值

    名字:麦当劳(没有比赛)

    姓:Obrian(无法匹配)

    结果情景3

    名字:麦当劳

    姓:Obrian

    场景4 :Fistname和Lastname都匹配

    传递值

    名字:麦克唐纳(已匹配)

    姓:Obrien(已匹配)

    结果情景4

    名字:麦克唐纳

    姓:奥布莱恩

答案 1 :(得分:1)

是的,有更好的方法。

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

以上方式将DataTable返回给您。但如果你想使用输出类型变量输出那么还有一个更好的解决方案

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