sruthi999 Ответов: 2

Текстовое поле,в котором пользователь вводит имя, может быть именем или фамилией, а затем на экране отображаются данные записи.Логика хранимых процедур не работает


есть текстовое поле,в котором пользователь вводит имя, которое может быть именем, фамилией или и тем, и другим.Все это вводится в одно текстовое поле пользовательского ввода.Затем хранимая процедура sql должна искать имя(имя,фамилию) даже может быть несколько записей,где пользователь может выбрать конкретное имя из повторяющегося имени во всплывающем окне или простой таблице. У меня нет особых навыков работы с sql server.У меня возникли проблемы с правильной логикой.

Код до сих пор выглядит следующим образом-


create PROCEDURE [dbo].[getfullnamereturnTest]
@NameSearch nvarchar(max)
AS

begin

   if exists (select * from testingtable where firstname='@NameSearch') 
begin
select distinct testingtable.firstname,testingtable.lastname,testingtable.country  from testingtable inner join
(
select testingtable.firstname,COUNT(*) as repitingnamesno
from testingtable
where testingtable.firstname ='@NameSearch'
group by testingtable.firstname
having count(testingtable.firstname)>1)
subq ON testingtable.firstname = subq.firstname
end
else if exists (select * from testingtable where lastname='@NameSearch')
begin
select distinct testingtable.firstname,testingtable.lastname,testingtable.country  from testingtable inner join
(
select testingtable.lastname,COUNT(*) as repitingnamesno
from testingtable
where testingtable.lastname ='@NameSearch'
group by testingtable.lastname
having count (testingtable.lastname)>1 )
subq ON testingtable.lastname = subq.lastname
end

else
begin
select distinct testingtable.firstname,testingtable.lastname,testingtable.country  from testingtable inner join
(
select testingtable.firstname,testingtable.lastname,COUNT(*) as repitingnamesno
from testingtable
where testingtable.firstname+testingtable.lastname ='@NameSearch'
group by testingtable.firstname,testingtable.lastname
having count (testingtable.firstname+testingtable.lastname)>1 ) 
subq ON testingtable.firstname = subq.firstname AND testingtable.lastname = subq.lastname
end
end
go


Поиск фамилии с помощью "Редди"

exec getfullnamereturnTest @NameSearch='reddy'


Хранимая процедура возвращает пустую таблицу.Даже если он состоит из нескольких записей по имени.Но когда я просто выполнил запрос без входного параметра, как показано ниже, и он работает нормально.

 if exists (select * from testingtable where firstname='reddy') 
begin
select distinct testingtable.firstname,testingtable.lastname,testingtable.country  from testingtable inner join
(
select testingtable.firstname,COUNT(*) as repitingnamesno
from testingtable
where testingtable.firstname ='reddy'
group by testingtable.firstname
having count(testingtable.firstname)>1)
subq ON testingtable.firstname = subq.firstname
end
else if exists (select * from testingtable where lastname='reddy')
begin
select distinct testingtable.firstname,testingtable.lastname,testingtable.country  from testingtable inner join
(
select testingtable.lastname,COUNT(*) as repitingnamesno
from testingtable
where testingtable.lastname ='reddy'
group by testingtable.lastname
having count (testingtable.lastname)>1 )
subq ON testingtable.lastname = subq.lastname
end

else
begin
select distinct testingtable.firstname,testingtable.lastname,testingtable.country  from testingtable inner join
(
select testingtable.firstname,testingtable.lastname,COUNT(*) as repitingnamesno
from testingtable
where testingtable.firstname+testingtable.lastname ='reddy'
group by testingtable.firstname,testingtable.lastname
having count (testingtable.firstname+testingtable.lastname)>1 ) 
subq ON testingtable.firstname = subq.firstname AND testingtable.lastname = subq.lastname
end


Он возвращает вывод, как показано ниже:
firstname	  lastname	country
    amulya	  Chdary	Uk
    amulya	  reddy	        BZ


Таблица состоит из следующих значений.

firstname	lastname	country
sruthi       	 reddy	         IND
sruthi	        chlka	        US
amulya	        Chdary	        Uk
sruthi	        K	        AUS
amulya	        reddy	        BZ
avasya          Koneru	        US
sruthi	        reddy	      AUS
amulya	        reddy	        BZ
avasya	        Koneru	        US
avasya	        koneru	        AUS


Табличные данные

CREATE TABLE [dbo].[testingtable](  [firstname] [nvarchar](50) NULL,    [lastname] [nvarchar](50) NULL,     [country] [nvarchar](max) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

INSERT INTO testingtable (firstname, lastname, country)
   VALUES ('sruthi','reddy' , 'IND'),
          ('sruthi','chlka' , 'US'),
          ('amulya', 'reddy', 'BZ'),
          ('amulya', 'Chdary', 'Uk'),
          ('avasya', 'Koneru', 'US'),
           ('avasya', 'Koneru', 'AUS'),
          ('amulya', 'reddy', 'BZ'),
           ('avasya', 'Koneru', 'US'),
           ('sruthi','K' , 'AUS'),
           ('sruthi','reddy' , 'AUS');

2 Ответов

Рейтинг:
1

Richard Deeming

Удалите одинарные кавычки из всех параметров.

Вместо:

where firstname='@NameSearch'

использовать:
where firstname=@NameSearch


Первый ищет записи, в которых первое имя равно литеральной строке '@NameSearch'; последний ищет записи, в которых первое имя равно значению в поле @NameSearch параметр.

Вы также должны прочитать Ложь Программисты Верят В Имена[^]. :)


Рейтинг:
0

Manas_Kumar

Попробуйте ниже код:

Изменять процедура со следующим запросом.

SELECT DISTINCT firstname, lastname, country
FROM testingtable
WHERE firstname = @NameSearch OR lastname = @NameSearch

Но я не уверен в вашей бизнес-логике с group by в вашем запросе. Если вы хотите, то вы можете слиться с этим запросом.