뷰 열을 NULL이 아닌 만드는 방법
열이 참 또는 거짓이되기를 원하는 뷰를 만들려고합니다. 그러나 내가 무엇을하든 SQL Server (2008)는 내 비트 열이 어떻게 든 널이 될 수 있는지 생각합니다.
"상태"열이있는 "제품"이라는 테이블이 INT, NULL
있습니다. 뷰에서 Product.Status 열이 3이면 BIT 열을 true로 설정하여 Product의 각 행에 대해 행을 반환하고, 명명 된 비트 필드가 false이면됩니다.
SQL 예
SELECT CAST( CASE ISNULL(Status, 0)
WHEN 3 THEN 1
ELSE 0
END AS bit) AS HasStatus
FROM dbo.Product
이 쿼리를 뷰로 저장하고 개체 탐색기에서 열을 보면 HasStatus 열이로 설정 BIT, NULL
됩니다. 그러나 NULL이 아니어야합니다. 내가 할이 열을 강제하는 데 사용할 수있는 몇 가지 마법의 SQL 트릭이 있습니까 NOT NULL
?
CAST()
주변을 제거하면 CASE
열 NOT NULL
이로 설정되어 원하는 INT
것이 아닙니다. 나는 그것을 원한다 BIT
. :-)
쿼리를 약간 다시 정렬하여 원하는 것을 얻을 수 있습니다. 비결은 ISNULL
SQL Server가 결과 값이하기 전에 외부에 될 것 NULL
입니다.
SELECT ISNULL(CAST(
CASE Status
WHEN 3 THEN 1
ELSE 0
END AS bit), 0) AS HasStatus
FROM dbo.Product
실제로 이것이 유용하다고 생각하는 한 가지 이유는 ORM을 사용할 때 결과 값을 nullable 형식으로 매핑하지 않습니다. 절대로 null이 아닌 응용 프로그램에서 모든 작업을 더 쉽게 할 수 있습니다. 다음 널 예외 등을 처리하기 위해 코드를 필요가 없습니다.
참고 로이 메시지를 실행하는 사람들의 경우 캐스트 / 변환 외부에 ISNULL ()을 추가하면 뷰의 최적화 프로그램이 엉망이 될 수 있습니다.
하지만 숫자 키와 동일한 값을 사용하지만 숫자 유형 결과를 다른 (나쁜, 알다시피) 2 개의 테이블이 있지만 최종적으로 뷰가 있습니다. 그러나 그러나 우리의 미들웨어 코드는 특정 데이터 유형을 찾고 있고 뷰에는 반환 된 열 주위에 CONVERT ()가 포함됩니다.
OP와 음료 뷰 결과의 열 설명자가 nullable로 정의되고 2 개의 테이블에서 기본 / 외래 키라고 생각했습니다. 결과가 nullable로 정의되기를 원하는 이유는 무엇입니까?
이 게시물을 발견하고 열과 짜잔 주위에 ISNULL ()을 던졌습니다.
문제는 쿼리가 해당 열에서 필터링 될 때 뷰의 성능이 바로 화장실로 내려 갔다는 것입니다.
어떤 뷰에 대한 결과 열에 대한 명시 적 적 CONVERT ()는 최적화 프로그램을 망가 뜨리지 어떤 (정밀도가 다르기 때문에 어쨌든 그렇게해야했습니다) 더 많은 ISNULL () 래퍼를 추가하면 큰 문제가 발생했습니다. 방법.
문에서 할 수있는 일은 데이터베이스 엔진이 클라이언트로 개인 데이터를 제어하는 것뿐입니다. 문은 기본 테이블의 구조에 영향을 미치는 언어를 선택합니다. 테이블 구조를 수정 비용 변경 테이블 문을 실행해야합니다.
- 먼저 테이블의 해당 비트 필드에 현재 null이 없는지 확인하십시오.
- 그런 다음 다음 ddl 문을 실행합니다.
Alter Table dbo.Product Alter column status bit not null
otoh, 당신이 모든 것이 뷰의 출력을 제어하는 것이라면, 당신이 충분합니다. 귀하의 구문은 뷰의 결과 집합 에서 HasStatus의 출력이 컬럼 실제로 것이라는 점을 보장 할 것이다 결코 널 (null) 일 수 없습니다. 그것은 항상 것입니다 음주 개체 탐색기의 말씀 걱정 중 하나 비트 값 = 1 비트 값 = 0이 ...
참고 URL : https://stackoverflow.com/questions/2326813/how-to-make-a-view-column-not-null
'ProgramingTip' 카테고리의 다른 글
Jersey 클라이언트 : 목록을 쿼리 매개 변수로 추가하는 방법 (0) | 2020.10.21 |
---|---|
내 레일이 환경에 어떤 진단이 있습니까? (0) | 2020.10.21 |
Java는 C # 속성과 어디에 있습니까? (0) | 2020.10.21 |
finish () 후 onCreate 흐름이 계속됩니다. (0) | 2020.10.21 |
JE / JNE와 JZ / JNZ의 차이점 (0) | 2020.10.21 |