2009-12-02 3 views
5

여기 거래가 있습니다. 우리 데이터베이스에서는 보안 및 모듈성을 위해 테이블 ​​값 함수에서 대부분의 읽기 (즉 select 문)를 래핑합니다. 그래서 하나 이상의 선택적 매개 변수를 정의하는 TVF가 있습니다. 내가 궐석 매개 변수로 TVF을 가지고 믿고ADO.NET에서 테이블 값 함수 호출에 대한 기본 키워드를 전달하는 방법

키워드 default의 사용을 의무화 그래서 같은 TVF 호출 할 때 :

괜찮
select * from fn_SampleTVF(123, DEFAULT, DEFAULT) 

, 모든 쿼리 분석기에서 작동하지만, 그것을 실제로 시간이 올 때 ADO.NET에서이 요청을하면 실제로 렌더링 된 SQL에 default이라는 단어를 넣는 SQL 매개 변수를 만드는 방법을 모르겠습니다.

String qry = "select * from fn_SampleTVF(@requiredParam, @optionalParam)"; 

DbCommand command = this.CreateStoreCommand(qry, CommandType.Text); 

SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
someRequiredParam.Value = 123; 
command.Parameters.Add(someRequiredParam); 

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

그래서, 누군가가 어떤 아이디어가 어떻게 TVF에 default를 전달할 수있어 :

지금은 대략 이런 일이?

+1

최적의 솔루션이 기본 조항에서 사용하지 않도록하는 것입니다 TVF 매개 변수 정의, Kevin 제안에 따라 null을 전달하고 수동으로 TVF 본문에 기본값을 만듭니다. 다음은 내가 찾은 기사입니다 (Sprocs에 관한 것이지만 문제는 동일합니다). http://social.msdn.microsoft.com/Forums/en/sqldataaccess/thread/3825fe1c-7b7e-4642-826b-ea024804f807 Microsoft와 관련된 다른 모든 작업과 마찬가지로이 작업을 수행하려면 절반 - 구운 해결 방법. – Mason

답변

0

Null을 매개 변수 값으로 전달할 수 있습니다.

이 문서

는 예를 보여줍니다 : 당신은 기본에 대해 (선택적 매개 변수) 위의 코드를 추가 할 필요가 없습니다 http://support.microsoft.com/kb/321902

+0

고마워요.하지만 분명히 null을 전달하면 tvf 정의에 정의 된 기본값이 무시되어 기본값이 쓸모 없게됩니다. – Mason

+0

귀하의 연구 결과를 듣고 싶습니다. 나는 당신의 질문을보기 전에 이것을 알 필요가 없다는 것에 놀랐다. 나는 여전히 Null이 작동하고 DBNull이 매개 변수의 정의를 무시할 것이라고 기대할 것입니다. –

+0

네, 방금 확인했는데, 좋지 않습니다. 그리고 그 이유는 사이에 차이가 있기 때문에입니다 : 선택 * fn_SampleTVF (123, DEFAULT)에서 및 선택 * 감사하지만 (123, 널 (null)) fn_SampleTVF에서. – Mason

3
SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = >>>> WTF? <<<< 
command.Parameters.Add(optionalParam); 

. SQL Server는 UDF에 정의 된대로 기본값을 사용합니다. 서로 다른 값을 전달하려는 그러나 경우에 당신은 전달할 수 있습니다

SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
optionalParam.Value = newValue; 
command.Parameters.Add(optionalParam); 
+0

또한 (지금까지 테스트 한 결과로) 데이터 유형을 지정하지 않아도되는 것 같습니다. 그래서 당신은 말할 수 있습니다 : command.Parameters.Add (새 SqlParameter ("@ OptionalParam", null)); ...[null]은 [default]로 해석 될 것입니다 – tbone

+1

편집 : 이전 코멘트가 틀립니다 : [null]은 ** [default]로 해석되지 않습니다 – tbone

+0

Ok, 더 많은 테스트를 마친 후에는 적어도 현재 프레임 워크 버전 나는 값을 지정하지 않고 매개 변수를 추가해도 기본값이 사용되지 않는다. [기본값]으로 SSMS에서 호출해도 값이없는 매개 변수를 전달하는 것과 동일한 결과가 발생하지 않습니다. https://msdn.microsoft.com/en-us/library/system.data의 암시적인 동작입니다. sqlclient.sqlparameter.value % 28v = vs.110 % 29.aspx – tbone

1

나는 그렇게했을 것 : 내가 지금-까지 본

public void YourMethod(int rparam, int? oparam = null) 
{ 
    String qry = string.Format("select * from fn_SampleTVF(@requiredParam, {0})" 
     , !oparam.HasValue ? "default" : "@optionalParam"); 

    SqlParameter someRequiredParam = new SqlParameter("@requiredParam", SqlDbType.Int); 
    someRequiredParam.Value = rparam; 
    command.Parameters.Add(someRequiredParam); 

    if (oparam.HasValue) 
    { 
     SqlParameter optionalParam = new SqlParameter("@optionalParam", SqlDbType.Int); 
     optionalParam.Value = oparam.Value; 
     command.Parameters.Add(optionalParam); 
    } 
} 
관련 문제