2012-03-17 12 views
4

は、私は私がパラメータとして1,2,3を渡すことができ、これらのIDは、複数のかもしれどのようにこのクエリの複数のパラメータを含むストアドプロシージャを作成する方法?

Create Proc dbo.GetApplicantsByIDs 

as 

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

のようなストアドプロシージャを書きたいです。

+0

表の値または文字列+スプリットは気にしています。見た後に多くの重複が見つかります。ほとんどの場合、 'IN'を' JOIN'に変更したいでしょう。 –

+0

これは機能的にはこの質問と同じです:[T-SQLの配列パラメータ](http://stackoverflow.com/questions/1070095/array-parameter-tsql) - そこでは最高の定評があります。 –

答えて

6

IDを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>' 
+0

働いてくれてありがとう。 –

1

私はよりよい解決策があると思います。

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

そして、私はあなたを書き換えることができます:あなたは'20,10,15,18,19'

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

入力データのための結果を得ることができ、結果はとなります

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 
) 

: あなたのような関数を作成することができます以下のような手順:

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

Select * from Applicants where ID in 
(SELECT value FROM [dbo].[Split](',', @Ids) 
1

は(そのために)テーブル変数を使用して別の解決策:

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アンナ

関連する問題