나는 내가 매개 변수로 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>'
잘 작동하는 고맙습니다. –
나는 더 나은 솔루션이있다 생각합니다. 당신은 같은 기능을 만들 수 있습니다 : 당신이 '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
)
을 결과는 다음과 같습니다
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)
,363,210
는 (그것의 이익을 위해) 테이블 변수를 사용하는 또 다른 방법 :
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) - 거기서 가장 높은 정답을 읽는 것이 좋습니다. –