2010-12-14 5 views
16

우리는 우리의 C# 코드에서 열거이 :이 값은 또한 데이터베이스 필드에 저장됩니다내 SQL 스크립트/procs 전체에 매직 넘버를 하드 코딩하지 않고 TSQL에서 enum을 어떻게 사용합니까?

public enum JobStatus 
{   
    Ready = 0,  
    Running = 1,   
    Cancelling = 2, 
} 

을, 우리는 많은 TSQL의 (주로 저장 발동뿐만 아니라 일부 배치 및 SSIS)가 그 또한 프로세스 데이터 :

SELECT TOP 1 @JobSID = JobSID 
FROM Job 
WHERE Status = 0 /* JobStatus.Ready */ 
ORDER BY SubmitDate ASC 

CREATE TABLE ImportCrossEffect(
    /* lots deleted */  
    Source tinyint 
     DEFAULT 1 NOT NULL -- 0: Unknown (default), 1:Imported, 2:Keyed 
) 

어떻게 하드 TSQL의 "매직 넘버"를 코딩 피할 수 있습니까?
C# 및 TSQL 측면에서 열거 형이 일치하지 않을 위험을 어떻게 제거합니까?

(나는 솔루션을 원하는만큼 나는 C#을 태그를 포함 한 그 C# 및 TSQL 측면 모두에서 열거 형의 "단일 소스"정의)


업데이트 :

데이터베이스에 열거 형 이름이있는 테이블이 없기 때문에 값은 단지 작은 int 열에 저장됩니다.

저는 모든 enum을 "마법의 가치"로 "확장"할 수있는 SQL 전처리 기가 필요했습니다.

+0

@OMG 조랑말, 내가보기를 사용하는 이상적인 좋아한다 데이터베이스에 뷰를 업데이트하는 것이 용이하다. –

답변

0

순수 TSQL에서 내가 생각할 수있는 유일한 점은 원하는 값을 반환하는 스칼라 UDF입니다.

LINQ to SQL에서 멤버를 C ​​#/.NET 열거 형으로 매핑하여 처리 할 수 ​​있습니다.

하지만 솔직히 말해서; 가장 순수한 TSQL에서는 주로 리터럴을 사용합니다.

+0

고마워, 나는 "스칼라 UDF"가 느리다는 말을 들었다.이게 사실인지 모르겠다. –

7

열거 형의 값을 항상 실행하려는 저장된 proc/명령으로 전달할 수 있습니다. 이렇게하면 데이터베이스의 열거에 대해 걱정할 필요가 없습니다. 데이터베이스에 열거을 저장하려면

, 그때 같은, 당신은 (아마도 당신의 열거로 제목) 뷰를 만들 제안 :

create view JobStatus 
    select 0 as Ready, 1 as Running, 2 as Cancelling 

당신은 다음 액세스/뷰의 경우에 가입 할 수 있습니다 너는 그것을 필요로한다.

참고 쿼리 최적화 프로그램은 위의 모든 참조를 테이블 스캔이 아닌 상수 스캔/스칼라 연산으로 취급하므로 실제 테이블에 액세스하는 경우 발생하는 읽기 작업이 발생하지 않습니다.

+0

소수의 값을 위해서, 테이블을 생성하고 그것을 채우는 것은 사소한 일이다. –

+0

감사합니다. 이것은 대부분의 TSQL에서 유용 할 수 있습니다. 열의 기본값에서 매직 넘버를 제거하는 방법에 대한 이상은 무엇입니까? –

1

하나의 프로젝트에서 데이터베이스에 예상되는 테이블과 값을 저장 한 모든 열거 형 멤버에 적용되는 특성을 정의했으며 단위 테스트에서 링크를 확인했습니다. 그래도 지저분 해.

0

아마도 일반적인 TSQL 대신 SQL 서버에서 관리 코드를 구현할 수 있습니까? 이 방법이 효과가있다면 100 % 확신 할 수는 없지만 탐색 할 수있는 옵션 일 수 있습니다. 뷰가 빌드 scrips에 의해 생성 될 수 있기

Possible Solution here...

관련 문제