は、私は私がパラメータとして1,2,3を渡すことができ、これらのIDは、複数のかもしれどのようにこのクエリの複数のパラメータを含むストアドプロシージャを作成する方法?
Create Proc dbo.GetApplicantsByIDs
as
Select * from Applicants where ID in (1,2,3,4)
のようなストアドプロシージャを書きたいです。
は、私は私がパラメータとして1,2,3を渡すことができ、これらのIDは、複数のかもしれどのようにこのクエリの複数のパラメータを含むストアドプロシージャを作成する方法?
Create Proc dbo.GetApplicantsByIDs
as
Select * from Applicants where ID in (1,2,3,4)
のようなストアドプロシージャを書きたいです。
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>'
働いてくれてありがとう。 –
私はよりよい解決策があると思います。
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)
は(そのために)テーブル変数を使用して別の解決策:
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アンナ
表の値または文字列+スプリットは気にしています。見た後に多くの重複が見つかります。ほとんどの場合、 'IN'を' JOIN'に変更したいでしょう。 –
これは機能的にはこの質問と同じです:[T-SQLの配列パラメータ](http://stackoverflow.com/questions/1070095/array-parameter-tsql) - そこでは最高の定評があります。 –