2009-05-07 8 views
0

여기에 내가하고 싶은 작업은 다음과 같습니다기본 매개 변수 값 전달과 매개 변수 전달 없음.

테이블

PeopleOutfit (id int primary key, boots int, hat int) 

그리고 저장 프로 시저를 감안할 때

UpdateOutfit @id int, @newBoots int = null, @newHat = null 

내가

exec UpdateOutfit @id=1, @newBoots=null, @newHat=5 
으로이 절차를 호출 여부를 알 수있는 방법이 있나요

1의 ID를 가진 사람이 맨발하고 다섯 번째 모자 자신의 현재 부츠를 유지 착용이 사람을 지시

exec UpdateOutfit @id=1, @newHat=5 

에서 다섯 번째 모자를 착용?

다른 말로하면 "저장 프로 시저 내에서"지정되지 않았기 때문에 기본값이 사용되었습니다. "에서"이 프로 시저를 명시 적으로 호출하여이 값을 기본값과 동일한 값으로 전달했습니다. ".

XML 또는 전달되는 필드의 비트 마스크를 전달하는 것과 같이 수행하고 싶은 작업을 수행하는 방법은 여러 가지가 있지만,이 정확한 기술의 사용 가능 여부를 확인하고 싶습니다.

편집 : 비트와 같은 작은 범위 유형이있는 필드의 경우 예약 된 값 전달이 작동하지 않습니다. 절차 오버로딩도 허용되지 않는 옵션입니다. 추가 "NotAValue"값을 사용하여 NULL 패러다임을 확장하는 사용자 정의 유형을 작성하는 것이 해결책 일 수 있지만이를 구현하는 방법에 대한 추가 지침이 필요합니다.

답변

1

제 추측은 아닙니다. 두 가지를 구분할 수 없습니다.

내 제안은 절대로 인수로 전달하지 않을 기본값을 사용하는 것입니다. 즉 기본값이 null 인 경우 @newBoots의 값으로 0을 전달할 수 있습니다.

+0

그래,하지만 그건 비트 필드에 문제가 될 수 있습니다. –

1

아니, 디폴트는 null

에 통과와 같은 "보이는"아마도 기본을 -1 뭔가 다른 일을하는 로직을 사용합니다.

0

엄밀히 말하면, 아니요, 실제로이를 수행 할 실제 기능이 없습니다. 그러나 매개 변수에 예약 된 값 (예 : 매우 작은 음수)을 사용하여이를 나타낼 수 있습니다.

0

본인이 직접하지 않았습니다. 비트 상태를 처리하기 위해 정수를 사용하는 3 가지 상태 비트를 일부 코드에 도입했습니다. 나는 SQL 서버에 액세스 할 수 없지만 때로는 후자의 생각을 좋아합니다. 하지만 일부 관리 뷰/함수를 통해 문자열 조작을 이해할 수있을 것이라고 생각합니다. 당신은 특권 많아서 실행해야하지만 난 돈 절대적이 켜지지의 경우, 언급 한 바와 같이이

SELECT 
    st.text 
FROM 
    sys.dm_exec_requests r 
CROSS APPLY 
    sys.dm_exec_sql_text(sql_handle) AS st 
WHERE 
    r.session_id = @@SPID 
+0

음 ... 나는 당신이 제안한 것을 정확히 이해하지 못한다. 그러나 나는 생각을 갖고 생각은 반영이라고 생각한다. 내 질문의 진정한 목적은 오버 헤드를 줄이는 것이므로 복잡한 서브 쿼리는 이에 대한 비용이 많이 드는 해결책이 없기 때문에 답이 아닙니다. 어쨌든 좋은 생각이야! –

+0

그는 실제 실행 된 TSQL 문을 검색하는 것에 대해 이야기합니다. SQL Server는 실행 된 모든 SQL 명령을 기록하며 시스템보기에서 SQL 명령을 볼 수 있습니다. 안타깝게도 그가 제공 한 뷰는 컴파일 된 명령문을 반환합니다. 따라서 스토어드 프로 시저 내에서 호출 코드가 아니라 저장된 proc 정의가 반환됩니다. – Rick

0

같은 것을 사용하여 st.text에서 그것을 해결하지 못할 이유 t보고, TSQL이 아무튼 ' 기본값을 제공하고 값을 제공하지 않습니다. 나는 기본적으로 엔진이 누락 된 매개 변수 (또는 DEFAULT 키워드로 호출 된 매개 변수)의 기본값을 대체한다고 생각합니다.

대신 "No Hat"으로 0을 사용하고 매개 변수가 지정되지 않은 경우 NULL을 사용하십시오.이 값은 알 수없는 값이거나 지정되지 않은 값을 의미하는 NULL의 사용을 권장합니다. "모자 없음"으로 NULL을 사용하면 데이터 유형의 범위에 추가 값을 추가 할 수 있습니다.

BIT 데이터 형식으로 생각해보십시오. 데이터 유형은 이진 값 (1 또는 0 또는 부울로 생각하는 경우 T/F)을 나타 내기 위해 정의됩니다. NULL을 유효한 값으로 처리하면 데이터 유형을 이진 옵션 (이제 세 가지 옵션, 1/0/NULL.) 현재 데이터 유형의 값이 부족하다면 너무 작은 유형을 사용하는 것이 좋습니다.

저장 프로 시저 호출로 돌아 가기; 디폴트 값을 NULL로 설정하고 NULL을 설정되지 않거나 지정되지 않은 것으로 처리하면 호출자는 proc를 호출 할 때 항상 널이 아닌 값을 지정해야합니다. NULL을 얻은 경우, 값을 제공하지 않았거나 NULL을 제공했거나 DEFAULT 키워드를 사용했다고 가정합니다.