2010-03-21 5 views
13

작은 웹 응용 프로그램에 SQL Server 2005를 사용했습니다. SP에 매개 변수를 전달하고 싶습니다. 하지만 하나의 조건이 있습니다. 시간에 따라 변할 수있는 매개 변수의 수. 생각 , 이번에는이 매개 변수의 범위는 1-30 수 있습니다SQL Server 저장 프로 시저에 가변 개수의 매개 변수를 전달하는 방법은 무엇입니까?

이름과 주소, 내가 이름, 성, 주소를 전달할 다음 번에, 통과

당신은 SP에서 매개 변수의 기본값을 설정할 수 있습니다

답변

6

레벨로 설정하여 매개 변수가 선택적이되도록합니다.

예컨대

CREATE PROCEDURE dbo.Test 
@param1 int, -- Not an optional 
@param2 int = 10, --Optional 
@param3 bit = 0, --Optional 
@param4 varchar(50) = '', --Optional 
@param5 nvarchar(100) = null --Optional 
-- more parameters ..... 
AS 
BEGIN 

-- The SQL goes here... 

END 

그런 다음 원하는 매개 변수를 채울 수 있습니다.

12

당신은 기본 매개 변수를 사용하여 프로 시저를 선언하고 대신 위치 매개 변수의 명명 된 매개 변수와 함께 호출 :

CREATE PROCEDURE usp_myProcedure 
    @name varchar(100) = '', 
    @surname varchar(100) = '', 
    @address varchar(100) = '' 
AS 
BEGIN 
... 
END 

는 T-SQL에서 호출 할 :

exec usp_myProcedure @name='John', @surname = 'Doe'; 
exec usp_myProcedure @name='Jane', @address = '123 Anystreet'; 

는 C#을에서 그것을 호출하려면 :

SqlCommand cmd = new SqlCommand('usp_MyProcedure', ...); 
cmd.CommandType = commandtype.StoredProcedure; 
cmd.Parameters.AddWithValue('@name', 'John'); 
cmd.Parameters.AddWithValue('@surname', 'Doe'); 
10

XML 유형을 사용할 수 있습니다. 다음은 샘플 절차입니다.

 
CREATE PROCEDURE udsp_VariableParams(@params XML) 
AS 
BEGIN 
    DECLARE @vdoc INT 
    EXEC sp_xml_preparedocument @vdoc OUTPUT, @params 
    SELECT * FROM OPENXML(@vdoc, '/params/param', 1) WITH ([paramname] VARCHAR(40), [paramvalue] VARCHAR(150)) 
    EXEC sp_xml_removedocument @vdoc  
END 

EXEC udsp_VariableParams 
    '<params> 
    <param paramname="name" paramvalue="value"/> 
    <param paramname="address" paramvalue="value"/> 
    </params>' 

EXEC udsp_VariableParams 
    '<params> 
    <param paramname="name" paramvalue="value"/> 
    <param paramname="surname" paramvalue="value"/> 
    <param paramname="address" paramvalue="value"/> 
    </params>' 
+2

나는이이 작전의 문제에 대한 과잉 생각 -하지만 나는 현재이 문제에 정말 유용 할 것 같아요! :) 감사! +1 –

1

XML에서 태그를 준비하고 exact하는 것은 성능이 뛰어납니다. 일관성없는 실행 타이밍은 계획의 캐시 여부에 따라 다릅니다. NVARCHAR (MAX)를 사용하여

대신 더 나은 옵션입니다. "@ name = Value"쌍으로 매개 변수 문자열을 준비하고 필요한 경우 고유 한 매개 변수 sepearetor를 추가하십시오. 프로 시저 내부에서 SUBSTRING, CHARINDEX 등을 사용하여 개별 매개 변수를 가져옵니다.

관련 문제