我创建了一个获取人名的存储过程,将名称与表中的值匹配,并通过输出变量返回正确的格式。如果名称不在表/数据库中,则存储过程只输出原始条目。这部分工作正常。
现在我想在同一个存储过程中同时使用名字和姓氏;例如:
我很难过,因为我不知道如何处理这两个名字,并且得到两个或一个,或者另一个:
我可以单独执行程序,但这不是明智的。
表名是:(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
感谢您寻找:
更新:请查看我的解决方案:
好的,发布后我回去修改了之前做错的代码: 即使一个名称匹配,它仍在工作但返回唯一值。但是我不确定这是最好的方法:
另一个变化:我只是使用两个变量来获得匹配而不是一个:
@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
答案 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 :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