Как написать хранимую процедуру, которая содержит несколько параметров для в запросе? - PullRequest
4 голосов
/ 17 марта 2012

Я хочу написать хранимую процедуру, подобную этой

Create Proc dbo.GetApplicantsByIDs

as

Select * from Applicants where ID in (1,2,3,4)

Как я могу передать 1,2,3 в качестве параметров, и эти идентификаторы могут быть кратны.

Ответы [ 3 ]

6 голосов
/ 17 марта 2012

Вы можете отправить свои идентификаторы в виде XML на SP.

create procedure dbo.GetApplicantsByIDs
  @IDList xml
as

-- Table to hold the id's
declare @IDs table(ID int primary key)

-- Fill table with id's  
insert into @IDs(ID)
select X.ID.value('.', 'int')
from @IDList.nodes('/i') as X(ID)

select * 
from Applicants 
where ID in (select ID 
             from @IDs)

Строка параметра должна выглядеть следующим образом:

'<i>1</i><i>2</i><i>3</i>'
1 голос
/ 18 марта 2012

Другое решение с использованием табличных переменных (ради этого):

if exists (select table_name from information_schema.tables where table_name = 'Applicants')
    drop table Applicants
go

create table Applicants (
    Id int identity,
    Name varchar(50)
)
go

insert Applicants (Name) values ('David')
insert Applicants (Name) values ('John')
insert Applicants (Name) values ('Scott')
insert Applicants (Name) values ('Anna')
insert Applicants (Name) values ('Esther')
go

create type IDs as table (
    ID int
)
go

if exists (select routine_name from information_schema.routines where routine_name = 'GetApplicantsByIDs')
    drop proc GetApplicantsByIDs
go

create proc GetApplicantsByIDs (
    @IDs IDs readonly
)
as 
begin
    select * from Applicants A where Id in (select * from @IDs)
end
go


declare @MyIDs as IDs
insert @MyIDs values (2)
insert @MyIDs values (4)
insert @MyIDs values (1)

exec GetApplicantsByIDs @MyIDs
go

Производит: 1 Дэвид 2 Джон 4 Анна

1 голос
/ 17 марта 2012

Я думаю, что есть лучшее решение.Вы можете создать такую ​​функцию, как:

CREATE FUNCTION [dbo].[Split] (@sep char(1), @s varchar(8000))
RETURNS table
AS
RETURN (
    WITH Pieces(pn, start, [stop]) AS (
      SELECT 1, 1, CHARINDEX(@sep, @s)
      UNION ALL
      SELECT pn + 1, [stop] + 1, CHARINDEX(@sep, @s, [stop] + 1)
      FROM Pieces
      WHERE [stop] > 0
    )
    SELECT pn as [index],
      SUBSTRING(@s, start, CASE WHEN [stop] > 0 THEN [stop]-start ELSE 8000 END) AS value
    FROM Pieces
  )

Затем вы можете получить результат для входных данных '20,10,15,18,19'

SELECT * FROM [dbo].[Split](',', '20,10,15,18,19')

Результат будет:

index   value
1   20
2   10
3   15
4   18
5   19

И я могу переписать вашу процедуру, как показано ниже:

Create Proc dbo.GetApplicantsByIDs         
         @Ids NVARCHAR(MAX)
as         

Select * from Applicants where ID in 
(SELECT value FROM [dbo].[Split](',', @Ids)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...