0

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

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

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

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

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

表名是:(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
4

2 回答 2

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 不匹配

通过值

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

姓氏:Obrian(没有匹配)

结果场景 1

姓名:麦克唐纳

姓氏:奥布莱恩

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

通过值

名字:麦当劳(没有匹配)

姓氏:Obrien(已匹配)

结果场景 2

姓名:麦克唐纳

姓名:奥布莱恩

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

通过值

名字:麦当劳(没有匹配)

姓氏:Obrian(没有匹配)

结果场景 3

姓名:麦克唐纳

姓氏:奥布莱恩

场景 4:Fistname 和 Lastname 都匹配

通过值

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

姓氏:Obrien(已匹配)

结果场景 4

姓名:麦克唐纳

姓名:奥布莱恩

于 2013-05-26T03:24:52.467 回答
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
于 2013-05-26T03:48:21.960 回答