2013-07-18 11 views
0

내 머리글이 매우 명확하지 않은 경우 죄송합니다.변수를 특정 값으로 설정하거나 열의 모든 값을 기본값으로 설정합니다.

Create Procedure Pro1 @a nvarchar = null, @b nvarchar =null 
as 
Select * from table1 
where Parameter1 = '1' 
and Parameter2 = @a 
go 

가 실제 코드는 아니지만 나는 내가 달성하기 위해 노력하고 있습니다에 대해 설명 바랍니다 : 내가 저장 프로 시저를 만들려고하고 있습니다. 두 매개 변수를 선택합니다. 'Parameter2'는 @a 변수에 따라 다릅니다. 내가 가진 도전은 만약 @a가 실행시 null로 남아 있다면; 나는 'and'문이 거기에 없었던 것처럼 select 문이 Parmeter2의 모든 값을 검색하기를 원한다. 나는 다른 선택을 실행하기 위해 if else 문을 쓸 수 있었지만 간단히 이렇게 설정할 수있는 와일드 카드 값인 일종의 @a를 설정할 수 있으면 좋겠습니까? 어쩌면 뭔가 : '[좋아']? 당신은 당신이 선택적 매개 변수의 많은 경우, SQL 서버 매개 변수 중 하나 개 세트에 대한 계획을 컴파일하고 그 계획은 다른 매개 변수에 매우 도움이되지 않습니다 것을 알 수 있습니다 어떤 경우

+2

간단한 대답 : 'AND (Parameter2 = @a OR @a IS NULL)'. 이 작업이 지나치게 복잡 해지면 동적 SQL을 사용하여 더 나은 성능을 발견하고 관련된 절만으로 문을 작성할 수 있습니다. –

+2

또한 [길이가없는 가변 길이 데이터 유형 선언을 중지하십시오] (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/09/bad-habits-to-kick-declaring-varchar-without-length .aspx). 소리 쳐서 미안하지만 왜 이렇게 많은 사람들이 이것에 대해 게으른 지 이해하지 못합니다. –

+0

실제로 코드에 길이가 포함되어 있습니다.이 예제에이 코드를 포함하는 것을 잊었습니다. – Arantuath

답변

2
CREATE PROCEDURE dbo.Pro1 -- use schema prefix when creating objects! 
    @a NVARCHAR(32) = NULL -- 32 should match data type of Parameter2 column 
AS 
BEGIN -- wrap your body and indent for readability 
    SET NOCOUNT ON; -- should always turn off DONE_IN_PROC messages 

    SELECT columns -- please name your columns instead of SELECT * 
    FROM dbo.table1 -- use schema prefix when referencing objects 
    WHERE (Parameter2 = @a OR @a IS NULL); -- semi-colons please! 
END 
GO 

. 따라서 다음과 같은 것을 원할 수 있습니다.

CREATE PROCEDURE dbo.Pro1 
    @a NVARCHAR(32) = NULL 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @sql NVARCHAR(MAX); 

    SET @sql = N'SELECT columns FROM dbo.table1 WHERE 1=1'; 

    IF @a IS NOT NULL 
    SET @sql += ' AND Parameter2 = @a'; 

    EXEC sp_executesql @sql, 
    N'@a NVARCHAR(32)', 
    @a; 
END 
GO 
관련 문제